Weekly Journal : SLogo Project Analysis
Reflection without action is ultimately as unproductive as action without reflection. — Robert Kegan
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 acknowledge 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 master
branch of your slogo_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 master
branch of your portfolio_NETID
repository:
slogo
folder:
- Example Programs: create at least three example SLogo programs and a 40-60 second video of it running that shows off something interesting about your project
- Code Masterpiece: Java file(s), totaling approximately 200-350 lines, that demonstrate well designed code you wrote during the project
- top-level (as usual):
Specifications
Example Programs
Create your own "interesting" example SLogo programs and record a 40-60 second video of loading and running them in your project (provide a voice over on the video to describe what makes your example interesting). Go beyond a simple test example to try to create a something that shows off important features of your project or its design by focusing on specific features of your project in creative and powerful ways.
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 program files.
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 example subclass to how it supports an 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 included that describe the class's purpose and why you think it is well designed
Simply copy only the Java code files you want us to review from your project to your portfolio, into a folder named slogo
, without renaming them so we can easily compare them to previous versions. You do not have to include files they depend on as we will not be compiling these versions, just reviewing on them.
Your masterpiece code must total between approximately 200-350 lines, including comments.
Design Analysis
Explain your view of how your program is organized and why it was done that way. This is an opportunity to describe how you might fix a problem, conceptualize something you thought about but could not figure out how to implement, or present an alternate design if you did not have time to actually refactor the code after learning something new, or any other learning you want to tell us about 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 each of the following (include all the parts of the code or resources that need to be changed):
- new command to the language
- new component to the front end
- any feature from the specification that was not implemented
- How do the Model and View depend on each other (i.e., what classes, behavior, exceptions, data, or resources are required by the other parts) and what is the role of the Controller(s), if any?
Evaluate two dependencies for each side (four 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 class, package, or module (OpenJFX))?
- Is the dependency 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 from the assignment specification — one you feel was made easier to implement by the code's design and one you feel could have been better supported by the design:
- Be as specific as possible about how existing abstractions and methods are helpful (or could be)
- Review one API designed primarily by your teammates:
- What makes it encapsulated or not (i.e., can the implementation be easily changed without affecting the rest of the program)? Give specific examples.
- What makes it easy to use and hard to misuse or not (i.e., do classes and methods do what you expect and have logic that is clear and easy to follow)? Give specific examples.
- In what ways does it provide for extension or not (i.e., how does it close its algorithm and promote users to create new functionality)?
- Conclusion: Describe what you think makes an API stable and also flexible
- Your Design. Reflect on the coding details of your part of the project:
- Discuss any Code Design Habit Checklist issues within your code (justify why they do not need to be fixed or describe how they could be fixed if you had more time).
Note, the checklist tool used in the last lab can be useful in automatically finding many checklist issues.
- 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 one API you designed:
- What makes it encapsulated or not (i.e., can the implementation be easily changed without affecting the rest of the program)? Give specific examples.
- What makes it easy to use and hard to misuse or not (i.e., do classes and methods do what you expect and have logic that is clear and easy to follow)? Give specific examples.
- In what ways does it provide for extension (or not) (i.e., how does it close its algorithm and promote users to create new functionality)?
- Review two features 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, 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 were affected by adding the multiple turtles features and why.
- 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 making your code data driven or at least removing the hardcoded values felt? When during the process of coding are you incorporating data files? Give a specific example (either positive or negative).
- How has thinking about
public
methods as APIs felt? Is it making a positive impact on how you conceptualize your code? 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.