The goal of my post here is to figure out #1: what exactly am I doing when I program, and #2: how do I improve each of these steps. I'm not talking about any of the overhead associated with a programming job but the actual coding work itself.
Right now it seems my work is broken down into the following 4 types of tasks:
A. Learning/Googling. How do I do this new thing?
B. Writing code. I know (or think I know) exactly what I am doing.
C. Debugging. I know what I am trying to do but it doesn't work.
D. Being generally confused. What are you doing ?? this design/naming convention/object model doesn't make any sense ...
Here are my current thoughts on how I can improve on each of these items.
A. Learning/Googling
Like most people, I feel like I am always googling questions throughout the day so I assume I'm good at that... But obviously there are more ways to learn.
6 ways to learn
- Read a book
- Watch a youtube video
- Take a class
- Google it
- Learn by watching someone do it
- Learn by doing
Since these are all self-explanatory, I will highlight the ones I probably need to think about more.
A. Book reading is probably one of my biggest takeaways here especially as a starting point for learning new concepts. My typical loop is:
with a good book reference the loop would probably be modified to the following:
B. I have had mixed results with youtube videos and learning. I feel like they are useful early on when I am first learning a large concept, but less useful after that.
C. I need to be more active about taking classes. For me personally I think a 2-3 day class is hugely useful. It just takes more proactivity on my part to set them up throughout the year.
In writing the next section, I realized I have to make sure that when I learn I make good notes for myself for future reference so I can minimize the re-learning required.
B. Writing code
I have just recently started using the pomodoro technique thanks to simpleprogrammer.com. This has worked wonders! I don't think I have actually quantified it yet, but it feels like a factor of 4x improvement in my output. My takeaways:
- Make sure to keep doing pomodoros even when you are squeezing in just a "couple minutes" especially late evening because that is when I am likely to get frustrated. (Pomodoro technique is basically working for 25 minutes, taking a break for 5 minutes and repeating. You don't allow any interruptions during this time and you focus on a single task. I have been amazed at how useful those 5 minute breaks are even when I think I am motivated and focused).
- Keep writing this blog as a reference manual for yourself. Especially blog worthy are the things that I learn that I need to paint a mental picture of a concept to learn. A great example of this is directives in AngularJS. I have wasted a lot of time re-learning directives. Huge example of a website I seem to reference all the time that you may find useful as well is this brilliantly simple illustration of how to do SQL Joins. https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
Final update on the "want to do a thing" flow chart is to include this last note at the end for the more complicated concepts:
C. Debugging
Learning the debugging tools is a huge requisite for debugging well. I only recently learned how to do use chrome's built in debugger for the client side code. This has removed a huge amount of time wasting from writing console.log(everywhere).
Here is a flow of how I think about debugging:
I think I need to do a better job admitting to myself when I don't understand a concept I am using and take the time to learn it instead of just "trying something." I think there is value in trying something, but more often than not I need to acknowledge the tool I'm using I really I have no idea how to use.
The other thing I should improve is make the things I do all the time more efficient. For example adding a simple crud operation to the whole stack rarely works first try. Adding a table, a route, an api call and adding it to the object model is very much the same every time! I'm sure a blog post might be useful here to figure out how to maximize code reuse and sort out a good process here since it is very much the same thing each time.
D. Being generally confused
Again, I'm not talking about confused in the since of I don't know how to do this or why doesn't this work. This is when I understand the problem, but am asking what are you doing ?? this design/naming convention/object model doesn't make any sense. Being confused for me in this way typically means I didn't come up with a sufficient mental model/design or just that I have learned enough that I need to refactor.
If I'm being honest, probably my biggest confusion recently has been on the best use of objects. I have tried a number of exercises and reading to try to internalize the best way to look at a problem and break it down properly into different objects. Perhaps I just need to accept that I can't get the objects right the first time and that refactoring the object model is a healthy part of building object oriented code.
I probably need to take a look at a couple of the following books:
Design-Patterns-Elements-Reusable-Object-Oriented
Refactoring Improving Design of Existing Code
(shout out to simple programmer again for this recommendation)
Summary
Overall I think my biggest takeaway is that I have some foundational holes with object oriented design and refactoring.
Specifically my takeaways:
A. Learning/Googling.
- Buy a couple of reference books for the new things I am learning
- When I learn complex things that require a mental model, write a blog post to explain them to myself in the future.
B. Writing code. Keep using pomodoros even for "quick" coding sessions.
C. Debugging. Write a blog post on the process of adding a simple feature requiring crud operations.
D. Being generally confused. Buy Clean Code, Reusable Object Oriented Designs, and Refactoring Improving Design of Existing Code.
What do you guys think? Any tips, books, or other recommendations?
Top comments (1)
You're going in the right direction, congrats!
I like the fact that you're leveraging books more often. That's a good move.
I'd suggest to draw your mental model/design and go through it step by step and figure out how to do each one, before writing any code.
A lot of your questions will raise here and you'll check a book or Google the concept of what you are trying to do and apply it to your use case.
Also, I would recommend not to default to Stack Overflow if something doesn't work. First, trace back your implementation, debug and/or follow the flow and try to isolate where is not working. Think about it for a while and read the necessary documentation (if using a library/framework or the specific language docs), chances are you'll figure out why this is not working.
If you didn't find out why, you'll probably come up with better keywords to search instead of just an error message.
Good luck!