diff --git a/README.md b/README.md index da77236..7420fde 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,6 @@ A production-grade Kotlin-based parser for NEM12 format energy meter reading fil **Development Dependencies:** - **Gradle**: Build automation tool - **JUnit**: Testing framework -- **Kotest**: Kotlin-specific assertions - **Ktlint**: Kotlin code style checker and formatter ### 1-3. How to Run diff --git a/questions.md b/questions.md new file mode 100644 index 0000000..8a54d9e --- /dev/null +++ b/questions.md @@ -0,0 +1,59 @@ +> What is the rationale for the technologies you have decided to use? + + The main technologies used and their rationales are as + follows: + + 1. **Kotlin**: + I noticed in the job description that Flo uses Kotlin. I + chose Kotlin because I believed it would be the most + effective way for the Flo team to understand my design + and implementation approach.
To be honest, I didn't specifically focus on leveraging JVM + advantages (such as garbage collection or multithreading) + in this project, nor did I apply those features. My + priority was object-oriented design principles, + particularly separation of business concerns, rather than + platform-specific optimizations. + + 2. **SQLite**: + I chose SQLite because it's well-suited for + assignment-style projects due to its simple setup with no + external dependencies. During the initial development + phase, database schemas often change frequently. I thought + it would be practical to validate the implementation with + SQLite first, then migrate to a production database like + MySQL or PostgreSQL later. + +> What would you have done differently if you had more time? + +1. I would have implemented a better dependency management + approach. Currently, the main function depends on all + layers: service, repository, and handler. This violates the + Layered Architecture principle, but it was unavoidable + since I didn't use Spring Framework and therefore had no + access to a Bean Container for dependency injection.
+ With more time, I would have implemented a proper DI + container (similar to Spring's Bean Container) to manage + dependencies correctly and maintain cleaner separation + between layers. + + 2. I missed the opportunity to set up a CI pipeline step + that would automatically run tests and block merges of failing code + into the main branch. + +> What is the rationale for the design choices that you have made? + + I prioritized code readability and maintainability for + future developers. + + Initially, I started without a strict Layered Architecture, + just separating some concerns. As development progressed, + this approach made it difficult to define clear dependency + relationships, and each component's responsibility became + ambiguous. This ultimately made writing test code + challenging and lowered overall code quality. + + To address these issues, I refactored the code using proper + design patterns (Repository, Composite, Template Method, + etc.) and established a clear Layered Architecture(in #12 PR). The + detailed rationale for each design decision is documented + in the README.md file.