The Developing Developer: Spring 2019 in Review
Spring 2019 of my MS - Computer & Information Science journey is now finished, at long last. Now that the smoke has cleared and the dust has settled, I'd like to take some time to reflect on and digest some of the things I've learned both as a growing software developer and as a human being, and share some things that might be of interest to you, especially if you've been on this journey, are on this journey, or are considering it for yourself.
I took more courses this semester than in the previous semester: namely, these are Advanced Programming Concepts, Web Programming: Server-Side, and Computer Networking. Each course has been a unique learning opportunity, with each course complementing each other in ways that revealed to me the almost Aristotelian unity of the different topics of study that fall under the aegis of Computer Science. Each of these courses has contributed to my growth as a human being and as a software developer, and I'll go through each course in turn as I have in the past.
Advanced Programming Concepts
Advanced Programming Concepts is perhaps a bit of a vague name for the course, but what it amounted to was "Object-Oriented Programming with Java." The form of the course was essentially that of guided self-learning - there were no lectures or class meetings to speak of, only a series of slides taken from the door-stopper Gaddis Java textbook. It covered the basics of object-oriented programming (OOP) and design, such as classes, inheritance, polymorphism, encapsulation, and how to effectively wield these tools and techniques to produce quality software. From the foundational concepts of OOP the course also had us study the basics of how to construct a GUI using Java's Swing and AWT libraries, and even how to build Java applets (which have largely been deprecated in current practice).
The course required students to complete a number of programming assignments (as might be expected), and each one utilized different OOP and Java GUI principles. The first assignment was to develop a simple GUI application utilizing an Employee superclass and a Manager subclass, allowing the user to select between employee and manager categories, enter relevant information, calculate a "raise," and display it in the GUI. While nothing special, it was a good way to dip our toes into the waters of Java GUI application development.
From there, we had to develop two small Java applets (displaying an oval and a hexagon, respectively), and this is where things got a bit interesting - it was around this time that I learned that applets are largely a thing of the past, and that Oracle (the company that manages the Java programming language) no longer supports applets in any meaningful way. This, understandably, made testing applets in a browser almost impossible, and after conferring with a classmate we determined that the best we could do is use the Applet Viewer that came packaged with our IDE (Integrated Development Environment).
Why this assignment was of particular interest to me is that it required the exercise of research and complex problem-solving in the face of the ever-shifting landscape of modern technologies, and it was a good reminder of the impermanence of our tools and techniques and the need to continually improvise and adapt in order to overcome these challenges. What could have been perceived as frustrating (as indeed it was) wound up being a fun and exciting challenge. It provided a deep insight into some wisdom I had learned from a software developer friend of mine: that the languages and tools themselves are not important and of themselves, but that the true work of software development is critical thinking and problem-solving, irrespective of language or framework. Those, after all, will always change - but the ability to think deeply and critically will never cease to be useful.
The last project of the class was to take a .txt file containing a list of student names and grades, ingest them into a GUI, and display them through that GUI in a table along with calculated final grades and a compendium of the number of A's, B's, and other letter grades found in the class. While this project was also an interesting endeavor, it mostly builds on the above-mentioned lessons, and so I won't reiterate them here. To see the code generated by the two main projects of this class, you can find them on my GitHub here: https://github.com/cartermjones/advanced-programming-concepts
?Web Programming: Server-Side
What can I say about this class? It was amazing. I've had a profound interest in web development since first starting to learn it last year (I've even got a website under my belt now!), but this class... this class really opened my eyes to the possibilities that are available to web developers when they develop applications using both the client-side (or front-end) and server-side (or back-end) in unison. It was transformative for me in a number of ways.
For those of you who may not know, the Internet as you use it is composed of many interconnected parts, and these can be broken into two overarching categories: the front-end (what you can see) and the back-end (what's happening behind the scenes on a server somewhere). While it's possible to create a nice, informational website using only front-end techniques, the real power of what's possible in web development comes from leveraging the back-end. Programming on the back-end allows for such things as user accounts, processing transactions securely, executing business logic, tapping into databases, and so much more. The front-end only scratches the surface: what makes things like Amazon, Facebook, and LinkedIn possible is what happens on the back-end. This class was, needless to say, quite eye-opening for me.
In this course we learned back-end development primarily through the medium of PHP, a common server-side scripting language. We also learned a bit of SQL (Structured Query Language), a language used for manipulating databases, and of course we learned, in broad terms, how the back-end functions and how all of its parts are interconnected and related.
The highlight of the semester was the one programming project that we had: we were required to develop a mock e-commerce platform that could display an inventory (read from a .txt file) and allow users to select items from the inventory, place them into a shopping cart, and checkout at the end of their shopping session. While the technical aspects of this project were interesting, the form of the project what was most instructive for me: I did this project as part of a team of myself and another person, who is a more experienced professional developer. Being able to collaborate on this project from start to finish and do pair programming was a wonderful insight into a real example of a software developer's thought process - it was a good exercise in teamwork on a software project and the things that go along with it, such as regular communication, version control using Git/GitHub, and dividing up tasks in order to make the code more manageable and maintainable. This was by far the most edifying part of the entire semester for me, and I hope that these lessons will prove useful in the future when I move into a software development role - something this experience has made me all the more excited to do.
Computer Networking
Ah, Computer Networking... what can I say about you? It was... not exactly what I expected. I expected to learn about computer networks and how to configure and maintain them, but instead what the course covered was the broad theoretical framework of what computer networks are and how they function, using the Internet as the primary example and case for study of networks. This course allowed a good insight into how the Internet functions (it is a "network of networks," as was often iterated throughout the course), and the problems and research areas that are prominent in the area of academic computer networking theory, such as network topology, load balancing, efficient and less-than-efficient methods for moving packets of information from one machine to another... and so forth. The material was often dense and dry to an extreme, but nevertheless there were some good learning moments here, as well.
The most instructive portion of the class was a project in which we were required to build a simple server and client that could be used to listen to requests/send files and send requests/receive files (respectively). I chose to implement this in Python, and it took two grueling weeks of slogging through Python socket programming documentation and Stack Overflow to get the things to work. Several times I contacted my professor for help when I got stuck, but to no avail - he doesn't believe in answering student emails, apparently. So I turned to software developer friends of mine to review my code in order to find my critical oversight, and then finally to Stack Overflow, a forum for developers in which other developers can review code and provide advice - often blunt, but usually correct advice. A denizen of Stack Overflow pointed out I had badly formatted an HTTP request, and BANG! Suddenly everything was working.
This helped me learn a couple of things: first, the humility to ask for help when something isn't working, and secondly, that often, when it comes to code, the devil is in the details. Computers are very fast, very precise... and very stupid. They are not as tolerant as you or I to errors such as the lack of a line break at the expected place - and this has helped me to learn to approach programming with exceeding care.
The code for this particular project, for those interested, can be viewed on my GitHub here:
https://github.com/cartermjones/computer-networking-with-python
Conclusions
This semester has been a whirlwind, one thing after another, and I'm glad that it's finished; at the same time, I'm profoundly grateful that it happened. It was full of lessons, ups and downs, and wonderful experiences of becoming more a part of the software development community. I hope that I can continue to develop in that direction (pun fully intended), and I hope that perhaps you have found something of use or interest in my experiences, if you've had the stamina to make it this far into my article.
Thank you for reading, and I hope to catch you again next time!
Until then, Godspeed, and happy learning!