Weekly Journal : Cell Society Project Analysis
You either win or you learn. I always reflect on the things that I could have done better, the things we could’ve done better to try and take that next step. — Jalen Hurts (Philadelphia Eagles quarterback who lost in last year's Super Bowl)
This analysis is your opportunity to demonstrate your own thinking and knowledge of
design concepts represented (or not) in the project's code. The Teaching Team can readily identify the good and bad aspects of project's design, so we are looking to see if you can also recognize these as well. If it is also an honest and
thoughtful retrospective, it can also help you identify specific actions you can do to improve future projects.
Submitting Your Work
As a team, complete the following on the main
branch of your cellsociety_teamNN
repository (no other modifications to this project repository should be made):
- DESIGN Document: complete the doc/DESIGN.md file (note, any part of this document or submitted lab discussions can also be used within your analysis as appropriate)
Individually, complete the following on the main
branch of your portfolio_NETID
repository:
cellsociety
folder:
- Example Simulation: make an example simulation and 40-60 second video of it running that shows off something interesting about your project
- Code Masterpiece: choose Java file(s) that demonstrate well designed code you wrote during the project, totaling approximately 150-300 lines
- top-level (as usual)
Specifications
Example Simulation
Create your own "interesting" example simulation configuration file(s) and record a 40-60 second video showing it and the result of running it in your project (provide a voice over on the video to describe what makes your example interesting). Go beyond a simple test example or starting configuration to show off important features or design elements by focusing on creative or powerful things your project can do (the video can cover any part of the running simulation, not just beginning after loading it).
The easiest way to make a video of your running project is to start a Zoom call, share your screen, start recording, and talk over your demo. There are also many free screen capture tools available or free trials of commercial tools.
Submit both the video and configuration file(s).
Code Masterpiece
Choose class(es) you primarily wrote that you feel demonstrate good design for us to review in detail.
The code should represent a component within your larger project that is small enough to be separable, but functionally significant enough to have some interesting design element. The term "component" is used rather than "class" because it may be several classes that work together, e.g., a few classes that work together or a superclass and its sub-classes. Note, if your component is specifically intended to be superclass, it must include enough detail that it is clear how to extend it and at least one subclass as an example of how it implements the abstraction.
- Every line of code in the class(es) you submit will be judged, you cannot specify parts of a class to ignore or include large sections of commented out code
- Add comments to the top of each class submitted that describe the class's purpose and justify why you think it is well designed
Simply copy without renaming the Java code files you want us to review to your portfolio repository, into a folder named cell_society
, so we can easily compare them to previous versions. You do not have to include any files they may depend on as we will just review them, not compile them.
Your masterpiece code must total between approximately 150-300 lines, including comments.
Design Analysis
This document is vital, as it is your opportunity to:
- explain your design decisions
- describe how you might fix a problem
- conceptualize something you thought about but could not figure out how to implement
- present an alternate design you preferred or if you did not have time to refactor the code after learning something new
- show any other learning that the code does not convey
If you think something is good, justify your opinion. If you think something is bad, justify your opinion and suggest how to improve it. Use specific code examples and supporting reasons related to design principles discussed in class or in the readings rather than general terms like "clearly/obviously", "good/sucks", "elegant/ugly", or "like/hate".
Note, no design is perfect so including both pros and cons (i.e., its trade-offs) or alternate designs you considered is highly encouraged (often designs cannot be seen as better or worse than another, but rather as a specific set of trade-offs that prioritize different goals).
- Overall Design. Reflect on the entire project by reviewing all the code, especially parts you did not write:
- Discuss the design of the complete program:
- Describe what is needed to add a new kind of simulation (i.e., all parts of the code that need to be changed to recognize new data files, new Automata rules, or new XML tags)?
- How do each of the three main modules (Simulation, Configuration, and Visualization) depend on each other (i.e., what classes, behavior, exceptions, data, or resources are required by the other parts)?
Evaluate two dependencies for each modules (six total) — for each, one you feel is good and one you feel could be improved:
- Is the dependency warranted (e.g., uses most or significant part of the imported class or package it comes from)?
- Is its use clear and easy to find (e.g.,
public
methods and parameters) or done based on "back channels" (e.g., static
calls, order of method call, requirements for specific subclass types)?
- Does the dependency help the code that uses it (e.g., makes the code more readable, hides an important detail, or closes the code) or not (e.g., requires a check for null, a "polymorphic" conditional, or assumption to use correctly)?
Note, you can use IntelliJ to help you find the dependencies within your project.
- Describe two examples of code for each of the following concepts — one you feel it embodies that principle or could be improved by applying that principle:
- Describe two features by their ID from the assignment specification — one you feel was made easier to implement by the code's design and one you feel could have been easily implemented due to the current design.
- Be as specific as possible about how existing abstractions and methods are helpful
- Review two features by their ID in detail implemented primarily by your teammates — one you feel is good and one you feel could be improved:
- Describe this feature's design in detail (what parts are closed? what implementation details are encapsulated? what assumptions are made? etc.)
- Evaluate this feature's design by referencing specific Design Requirement ID(s) (justifying why you feel it is good or explaining how you would improve it)
- Conclusion: Describe what you think makes this project's overall design flexible or not (such as what new changes does it support making easily)
- Your Design. Reflect on the coding details of your part of the project:
- Discuss any Static Code Analysis Issues remaining in your code (justify why they do not need to be fixed or describe how they could be fixed if you had more time)
- Describe one abstraction (either inheritance hierarchy or class that uses polymorphism effectively) you created (or wish you had) and how it helped (or would have helped) the design
- Describe one design challenge you wrestled with:
- What alternate designs were considered?
- What are the trade-offs of all the design options (describe the pros and cons of the different designs)?
- How did you eventually handle it?
- Why are you satisfied or not with the final solution (i.e., in hindsight do you wish it could have been done differently due to how it made coding more difficult, based on the course readings, etc.)?
- Review two features by their ID you implemented in detail — one you feel is well designed and one whose design could be improved:
- Describe this feature's design in detail (what parts are closed? what implementation details are encapsulated? what assumptions are made? etc.)
- Evaluate this feature's design by referencing specific Design Requirement ID(s) (justifying why you feel it is good or explaining how you would improve it)
- Conclusion: Describe your specific efforts to make your code as encapsulated or abstract as possible.
- Alternate Designs. Reflect on alternate designs for the project based on your analysis of the current design or project discussions.
- Describe which classes would be affected by changing the Grid's data structure (say from a 2D array to a Map or vice versa)
- Describe how well (or poorly) the original design handled the project's change specifications and how they were discussed and decisions ultimately made
- Describe one assumption or choice made about the assignment specifications or the code that had a global or significant impact on the design
- Review two design decisions discussed by the team about any part of the program in detail:
- What alternate designs were considered?
- What are the trade-offs of all the design options (describe the pros and cons of the different designs)?
- Which did you prefer and why (it does not have to be one that is currently implemented)?
- Why are you satisfied or not with the final solution (i.e., in hindsight do you wish it could have been done differently due to how it made coding more difficult, based on the course readings, etc.)?
- Conclusion: Describe what kinds of things you think affect whether a choice can be encapsulated or will impact the overall design.
- Conclusions. Reflect on what you have learned about designing programs through this project:
- Describe two coding habits you noticed this project — one that has changed for the better and one you are still working on changing
- How has the act of refactoring code felt? Are the goals clear and is it making a positive impact? Give a specific example (either positive or negative).
- What have you learned about design by reading your team mates' code or by Pair Programming? Give a specific example (either positive or negative).
- How has your perspective on the practice of coding changed because of this project?
- What specific steps can you take to become a better designer in the next project?
Your analysis must cite specific code examples from the project and citations from the course readings.