Learning Strategies

I was up late last night contemplating what I’ve been learning and what I aim to learn, which I want to blog about. But first, a vignette:

Yesterday a technical lead from Microsoft added me as a connection on Linkedin. I have no idea why, and we don’t have any connections through other people. I suppose my company has a big name, that’s all I can possibly think of. This girl has a seriously bad ass profile. Graduated from a top Ivy League school, has held positions at Apple and IBM, and she doesn’t waste her time listing stupid languages on her skills list. Instead there are items such as “Architecture” and “Leadership” and other categories. I’d long suspected my listing of individual languages was an amateurish approach, and I know I’m right. Basically, this girl could kick my ass. Not that that’s a bad thing, but it really makes me feel like a weenie programmer.

Ok, so, here’s a short rundown of some of the books on my shelf. I’m making progress through Learning Python, Database Design for Mere Mortals, Python Algorithms, Pro Oracle Spatial, C# 6.0 and the .NET 4.6 Framework, Head First Design Patterns, and I haven’t touched it in awhile but The Web Application Hacker’s Handbook. Books on the shelf I hope to read after these include Pro ASP.NET Core MVC, Xamarin Mobile Application Development, Beginning SOLID Principles and Design Patterns for ASP.NET Development, A Smarter Way to Learn jQuery, and a few others.

Now, here’s the problem. I haven’t been writing much code lately. I started the Project Euler problems with Python, and I know I still need to fix my XML Formatter, but in general the only code I have written has been at work. This is great but I didn’t get many chances to write code at my previous job, but I’m not writing enough, and I have got to get better at algorithms. But I love reading books. I love the feeling of progress, and the proof as I watch the book mark snake its way down through the pages. But I also know that reading a book is not the same as learning.

I have always had a complicated relationship with books. It’s a love-hate relationship. I love reading books, but I hate how long they take to read, and I hate the pressure of having them sitting over me, waiting to be read. That pressure was very real last night. They have the distinct disadvantage of being – quite naturally – verbose. They tend not to get down to the main point. I love having the big picture, and that’s why I read them, but especially with Database Design for Mere Mortals, for example, I find myself slogging through cruft just to find the meaningful information.

I have always wanted to master the things I set out to learn, and this has also been a huge hindrance. An old supervisor advised me not learn regular expressions thoroughly because he said I could always look the information up again later, but I resented this advice because I really wanted to master regular expressions. I’m a poor polyglot programmer, I’d really much rather master what I know, but this may get me into serious trouble later in my career. Again, that Microsoft technical lead doesn’t highlight many languages at all because she knows languages aren’t the point.

So what am I doing? I’m so focused on reading these books cover-to-cover that I’m not leaving myself with any room to write code. This could be a deadly mistake.

I’m not sure exactly where this post is going, but I am actively reassessing how I approach learning. I have largely resented the explosion of Javascript frameworks because I fear learning a new one would require too much effort. But a friend has been learning Node.js over the past several weeks and hasn’t bought a single book for it. What am I so worried about? Regardless, Python is my favorite language so my motivation to master it goes beyond my career, though I’m very fortunate to now have a job primarily using Python. I will keep going with all my Python material for sure. But I may want to rethink whether I need a 1000 page book on Core MVC. I’ve already elected to donate away my CSS3 and Visual Basic books. Honestly, I’m not going to read a book on CSS3, I know 80% of everything in there, and I’ve done enough C# that a book on VB is completely unnecessary given my access to Google.

Anyway, thanks to my new connection, I’m reminded that it’s best not to waste my time and to get down to business. I’ve owned the perspective of exclusively relying on books for a long time now, so changing may be difficult.

Clean Code

I’m almost finished reading “Clean Code” by Robert Martin. I was expecting it to revolutionize my understanding of programming, but in the end it really didn’t. As one reviewer on Amazon noted, it’s better off being called “Clean Java”. If you make it past the arrogance, you may decide to skip the parts on JUnit, EJB, and refactoring (which is really just one giant Java program with textual comments).

l learned a lot from the sections on functions, classes, and comments. The best thing you can get from the book, however, is a better understanding that there are competing standards, and your are better off knowing what they are and why they are there.

Just writing code is not enough. There is so much to it. Not considering the customer side of things, you should probably know design patterns, data structures and algorithms, application architecture, general coding best-practices, multi-threading and concurrency, application security, test-driven development and automated unit tests, and IDE features and frameworks. This is on top of knowing several languages thoroughly, writing code in your free time, contributing to open-source projects, and have good social and customer service skills.

It’s no wonder that nobody really knows how to codify programmers. And Computer Science programs still make you spend a lot of time learning Calculus III. As a developer who loves to learn, I’m not sure how long it will take me to learn all of these. It’s mind blowing that I came across so many companies recently who wanted to hire somebody who had skills in all or most of these areas with less than five years of experience! Ok, so two people said the concurrency could slide, but still.

This is also perhaps the only industry that expects you to have “passion” and wants to see you coding outside of work. I understand how that can be a valuable indicator of your performance on the job-we don’t want Jimmy typing on a screen all day if he hates doing it at home-but the fact that it has become an expectation is disturbing.

As much as I love learning, I can’t fit all of that in right now. Learning takes time, even when you can pick things up quickly. That’s something I get to prove on the job here soon. I do like the idea of tradecraft, that there is a good way to write code and some best practices that can help you really stand out as a professional. But I can’t say I trust that from any one developer, no matter how famous of a company he’s worked for, and a lot of those companies are churning out bloated pigs branded as software.

Speaking of, I had a Windows process max out a brand new Intel i7 processor the other day, and I cannot imagine what sort of trash caused that to happen under the coverts.

Push on, keep fighting! I have way too many books, but it is worth it!

Growth

I start my new job on Monday. According to the employee policy handbook, I’m not allowed to really mention or link to my new employer, but I’m excited. I’ve been reading up on Oracle Spatial and investing in some more in-depth Python knowledge.

Yesterday I paid a visit to my former employer to visit all my friends and catch up on happenings over the last three months. It was bittersweet, but it sounded like not much has happened since I left. Three months isn’t all that long, I suppose.

I asked myself where I would be if I had chosen to remain there. The Security+ certification would still be on my two year goals list, I wouldn’t know 90% of what I have learned about C#, I wouldn’t know what WPF is, I wouldn’t know any HTTP or how to even begin testing website security. I would not know what I really need to learn for the industry, I would not have found out what I really want to do. I would probably not have finished off some of my personal projects. This isn’t meant as a criticism of my former employer, but I think it is to say that leaving was the right choice for me. I feel engaged in the industry, and I’ve never been so excited to start a job. I get to program Python and PL/SQL on top of Oracle Spatial, daily. I get to dig through masses of tables and get them to do what I need. That’s awesome!

It’s easy to get comfortable when we aren’t growing. To sit back, chill. That’s what happened to me before: I didn’t find the work engaging or challenging, and I lost all motivation and drive. You really have to know yourself; a company with the greatest community is a bad fit if the work isn’t engaging. But now, I love knowing that what I study will have a direct impact on my job. I even scooped up a book on Oracle performance tuning because my new boss mentioned in our interview that they had a query that was taking too long to run. I want to fix that!

Friendships are very important to me, but you still have to have goals in life or you aren’t likely to achieve anything. Leaving friends can be hard, but I have too many friends who come alive with passion when they talk about things they don’t do at work. I’m always wondering, “Why don’t you go do those things for work?” It’s risky. Believe me, I know. Three¬† months. But this was worth it. I’m very blessed this worked out.

Also, I will be doing volunteer coding for a small ethical manufacturing company in Nepal. I’ve followed them for years, and now I get to talk with them, and have even been doing requirements gathering and some basic project management. I’m excited to build this program out for them, I think it will be a lot of fun and will really help them out. This has gotten me reading a book called “Database Design For Mere Mortals”, which even has some huge sections dedicated to requirements gathering for databases, so it’s perfect for what I will be doing.