Some backstory to this post
I’m in the process of redesigning this website to put more focus on my web development capabilities, highlight some projects I’ve worked on, and otherwise showcase just how much I’ve learned since earning my computer programming degree a mere two and a half years ago. Before enrolling in an academic program, I’d been building static websites since the summer of 2003, when I first purchased “The Complete Idiot’s Guide to Building Your Own Web Page”, but I’d never gone beyond basic HTML and CSS. In college, I reinforced my knowledge of my base skills, and had additionally been exposed to a broad set of languages and platforms. My homework involved writing code in PHP, JavaScript, Python, C++, Java (and JSP), and MySQL, as well as exploring data structures concepts, learning about orders of magnitude, reading up on how machine languages work, doing binary math, and more. I also took a class on computer networking, so I gained some knowledge about using the command line in Linux, and configuring workstations in Windows.
For the most part, college was great for introducing me to some basic concepts and help me discover in general what it is I wanted to do, but didn’t fully prepare me for the realities of what it’s like to work as a professional developer. If you were to ask anyone in any field about their own college experiences, they would likely tell you the same thing – they probably got some basic building blocks, but once thrown into real work, the landscape changes dramatically.
Sure, I learned some basic terminal commands in college, but we never talked about version control. I didn’t learn how to configure a virtual machine. I’d never used a pre-processor to compile my stylesheets. Aside from jQuery, we didn’t really discuss how or why to use third-party libraries. We used phpMyAdmin and MySQL WorkBench as GUIs for interacting with a MySQL database, but students were never really introduced to alternatives, or shown that, “Hey! You can use this desktop software to talk to a remote server, not just the one installed on your local machine.” Although they existed, we didn’t talk about taskrunners like Grunt, or about the need to minimize HTTP requests and the importance of compressing your JavaScript and CSS files. Heck, we didn’t even talk about REST or how to communicate with an API.
This is all knowledge one starts to glean on their own once they’re finally given a real project and tasked with figuring out how to convert it from a conceptual idea into a working piece of software.
This Weekend
Okay, so fast-forward to this weekend, or rather, a week and a half ago. PHP 7 was finally released, and I decided I wanted to upgrade this site to the current version primarily so I can take advantage of its increased performance. This weekend, I decided, “Well, I’m running PHP 7 online, I may as well install it locally so that I can start writing my code in PHP 7, too. I can use scalar type hints! I can define return types! And heck, I’ll start using short array syntax, even though it was introduced three versions ago. It’s my site, so I know what technology I’m running on. I’LL DO WHAT I WANT!”
That was all well and good, before I realized that I don’t really know *how* to install PHP. Do I just do it over OS X’s pre-installed version? Nah, that’s probably a bad idea. Can I upgrade my VVV box? Also probably a bad idea – I might still have some freelance client sites on there that still need PHP 5.5. I decided to download Rasmus Lerdorf’s Vagrant box on Github. The instructions in his README file are good enough to get up and running, and I know enough about MySQL and Apache/Nginx to get my environment set up. Or so I thought. Sure, I got the site up and running, but once I started working on my new theme, I realized my CSS changes weren’t propagating.
I won’t bore you with the details (assuming you’re not bored already if you’ve read this far), but needless to say, my CSS files were being served by Nginx, which meant they were getting cached. A few hours of searching on Google, and I eventually learned there’s a setting called sendfile that you can set to off, and suddenly, everything was updating normally.
Today, I intended to set up a development domain so I could push my local changes to my remote server and test it on a real environment before I push everything live. I’m not on a managed host, so this poses additional challenges, because, although I’ve deployed many client sites in the past two and a half years, I still wouldn’t consider myself a DNS expert, and my aforementioned skills in Apache and Nginx are passing, but not proficient. I messed it up. This site briefly showed “Hello World” because of my misconfiguration. I reverted everything, and vowed to tackle it another time.
I’ll get there, eventually, by the new year, for sure, but I think I’ve had enough server configuration and administration lessons for one weekend.
The Point of All This
I hear all the time from new developers or people looking into learning the craft that they’re not sure about their own path for learning. I understand where they’re coming from – it’s incredibly hard to decipher what’s meaningful knowledge that will push you forward in your career, and what’s just an interesting side-attraction that’s fun to play with but doesn’t provide any actual value. You learn by doing; you learn from your mistakes, by trial and error.
But that’s not all. You also learn by deciding what to learn, by choosing something specific and deciding to learn it as thoroughly as you can. And you learn by talking to other developers in the community, discussing what tools they use in their day-to-day work, and finding out what skills they need to get their projects done. And lastly, you explore, because there is no one right way, and because having a curiosity about other solutions, other tools, and other libraries that solve a specific problem is the best way to advance your skill set.
My immediate goal for the end of the year is to get my new theme launched. Once I have, it will be running the latest version of WordPress, on the latest version of PHP, and I know I will have learned a lot about servers in the meantime. From there, I need to bolster my JavaScript knowledge, because WordPress is moving in that direction. I also need to learn another framework, because I might want to work on projects that don’t involve WordPress at all. I need to learn more about system architecture, because longer-term, I would like to do more server-side work and develop well-structured systems. This means that I need to know more about caching, and routing, and service-oriented architecture, and how to build an API, and…well, the list goes on and on.
Most importantly, it means that I need to make a significant effort to find a mentor – or several – who can help guide me on this path. Sure, it’s possible I can do this all on my own, but having a mentor means I can have a sounding board for voicing ideas, questions, and concerns, and more importantly, I can gain validation that the decisions I’m making when developing software are well-informed ones.
There’s no right way to learn. But, evaluating your own skill set, celebrating your past achievements, and determining a path for the future can go a long way toward establishing a focus. And nothing helps one learn like focus.