Showing posts with label Computer Science. Show all posts
Showing posts with label Computer Science. Show all posts

Wednesday, August 26, 2020

Reflections on a Master's in Computer Science - pt. 2/2

This post is the second in a two part series, read the first part about how I chose my Master's program and my overall thoughts here!

Ten Courses to Graduate

Making it out of OMSCS alive requires completing 10 of their current courses with a grade of C or better. Of the 10, 5-6 courses must be within a certain specialization, and be completed with a grade of B or better. Lastly, your overall GPA must be 3.0 or higher to graduate. There are some finer technicalities, but those are the basics. There is no capstone project that you're working up to.

Courses are offered during three semesters over the course of the year - Fall and Spring (each 16 weeks) and Summer (an accelerated 12 weeks) - with a couple weeks break between semesters. If you are working full-time and taking one course at a time (usually recommended), that's three years and one semester. I doubled up with less-demanding courses this past Spring, so I did it in three years even. The current cost of one semester with one course is 540.00 tuition + 194.00 special institutional fee + 107.00 technology fee = $841.00.

There is no recommended order of courses that you're required to take. This might seem odd for prospective students expecting to continue through the program with one cohort of fellow students, and instead find your first course filled with students in their final course and vice versa. I actually find this to be a positive because you can define your own order based on your expertise, interest level, and goals. You will need to choose your first two courses from courses labeled "foundational," but afterwards all 31 computer science courses are open to you (a fraction of on-campus courses). Unfortunately, very few if any courses were added during my three years in the program, though a few courses from other disciplines are available (I wasn't interested and didn't explore this avenue).

So how do you choose? Well, you make a spreadsheet of course! Essentially I listed out all of the available courses along with my general interest levels (/5), and then used the student reviews on OMSCentral to pick out the community ratings (/5), workloads (in hours), and difficulties (/5). This is a very active site and I submitted my own reviews for the courses I took; I think the rating averages are more or less accurate, but the reported workloads are unfortunately on the lower side if you're newer to programming like myself (they may also be biased because workload is generally lower towards the end of the semester). I used my interest level averages to determine the optimal specialization for myself (Interactive Intelligence, as it turned out), and then noted which courses would fulfill which parts of the specialization requirements. Lastly, I included course-by-course pre-requisites or prior baseline knowledge, which I found on course pages and elsewhere. However, I found that success in a course was usually a factor of how deeply you absorb the learning material rather than how much supplemental learning material you seek out beforehand (with the possible exception of AI and ML).

Without further ado, here are the courses I took:
  1. CS 6300: Software Development Process (Fall 2017)
  2. CS 6400: Database Systems Concepts and Design (Spring 2018)
  3. CS 6035: Introduction to Information Security (Summer 2018)
  4. CS 6601: Artificial Intelligence (Fall 2018)
  5. CS 6440: Introduction to Health Informatics (Spring 2019)
  6. CS 6460: Educational Technology (Summer 2019)
  7. CS 7641: Machine Learning (Fall 2019)
  8. CS 6250: Computer Networks (Spring 2020)
  9. CS 7646: Machine Learning for Trading (Spring 2020)
  10. CS 6750: Human-Computer Interaction (Summer 2020)
*Bold courses are part of the Interactive Intelligence specialization

My top three favorite courses were Software Development Process, Human-Computer Interaction, and the concepts and group project in Introduction to Health Informatics. I think this had a lot to do with the professors, who were both organized in their schedules and clear in how the assignments would meet learning objectives. Plus the material was just downright cool.

My top three most challenging courses that helped me grow were Artificial Intelligence, Machine Learning, and Educational Technology. The effort frequently exceeded 30 hours in any given week (AI was above 60 at times), and required me to push myself further to find answers than I knew I had the ability to.

Would I Recommend?

I would recommend prospective students consider applying for OMSCS under these conditions:
  1. You can see a direct benefit of getting a master's degree in your career, without which you could not accomplish your goals; OR you enjoy scholastic challenges and the prospect of studying new things in school is exciting for you (no judgement)
  2. You can afford the cost of $841 (or more with additional classes) per semester, through financial aid, tuition reimbursement, family lending, or out of pocket
  3. You can afford the time, and can dedicate roughly 20 hours per week for three years (to earn a 3.0 GPA or better)
    1. Let me emphasize, this will include making sacrifices in terms of spending time with loved ones and doing activities you enjoy (reading books, playing video games, watching movies, etc.)

Not gonna lie, those were a looong three years at times. I did my best to stay positive, enjoy the learning process, and remind myself of why I got into this mess. I don't know if I would have seen it through to the end if it weren't for the support from my wife, the rest of my family, and my friends. My standard supply stash for going out during OMSCS semesters would always include my tablet and a pair of headphones, and perhaps even my laptop if I had a coding assignment to work on. At work, during lunch breaks I would set a 30 minute timebox and complete as much work as possible. Then I would come home from work, and instead of relaxing I'd gear up to spend the night studying. At parties and gatherings, I would lock myself away in another room, coming out for 10 minutes every half an hour and endure everyone's eye rolls when my timer went off. If I was lucky then all I needed to do was to review flashcards on my phone, which I would do while sitting in front of the TV, during conversation breaks at dinners, or in my free hand as I used the bathroom. Staying up late completing assignments would sometimes get so lonely that I'd play a movie on another screen just to feel like someone else was there with me.

No, the above is not a joke (I've forgotten what jokes and fun are 😅). And yes, it was depressing at times. You couldn't really escape the anxiety that work was hanging over your head, and forget about taking a day off - what a nightmare getting caught up! Maybe one of the worst parts was that I rarely got a true vacation from it all. During those couple weeks breaks between semesters I'd usually be focused on catching up on the honeydo list and house chores that I'd put off during the semester. Come to think of it, part of me feels like I had prepared for the first two years and against all odds pushed for that final year. Knowing what I know now, would I still have chosen to do the program? Absolutely, preferably heeding the pro tips below. But would I do something like this again? Hell no, been there done that.

Completing this OMSCS program requires some next-level dedication. I think it goes without saying that not everyone studies the same way that I do, and many people will pick things up quicker and enjoy the studious process at a deeper level. I also came to this program in a unique situation as you can see from my blog, learning CS for the first time and looking to develop a core educational competency, so I knew that I would need to work harder than most students to make up the difference in skillsets. But if you can say yes to my three conditions above and the reality check of my own experiences doesn't scare you off, I can promise you this: you will reap what you sow. All of that hard work, all of those sacrifices, and all of those combined learning moments will build you that competency diving board to spring from in your professional career. Could I have achieved the same learning result as quickly from self-study? Maybe, and that could have led to better preparation in certain areas. But I certainly would not have been exposed to as many areas outside my comfort zone with cleverly designed projects, providing a much more effective starting point for self-study.

Pro Tips

If you're going to be starting OMSCS soon, or if you are already a student, here are a few tips that I've picked up along the way that may be useful.
  1. Get started on assignments early. This is a cliche so let's get it out of the way. Even if the course learning materials will explain what you need to know in order to complete the assignments, before you start the learning materials go ahead and read through the assignment description. Get an idea of what you'll be working on so you know what part of the learning materials to prioritize your focus, then maybe create an outline of the requirements, and better yet get your coding classes and repos ready to begin work. Starting there will help you to allocate your time.
  2. Watch videos quickly. Always watch video lectures at 2x speed, whenever possible. You could work up to this by starting at 1.5x speed, but eventually anything less than 2x speed will seem agonizingly slooowww.
  3. Skim readings. The material can be dense and dry at times, but the good news is that you're hardly ever graded on the finer details and when you are it will be for open-book exams. For the most part you can skim the readings for the general idea, though I will admit this is an acquired skill. Read the abstract, the introduction, the conclusion, and then go back and skim relevant/interesting sections in the middle.
  4. Register for courses immediately. It can sometimes be a challenge to compete against the nearly 10,000 enrolled students to register for the courses you want (especially in your first couple semesters). Put your course registration times in your calendar and prepare to register within 3 seconds of that time slot. You can do this by looking up the CRN numbers for the courses you're interested in ahead of time, and then choose Add to Worksheet in Buzzport to paste them in at the allotted time. Have a backup course in case you get waitlisted, but it's still very possible it will open up by the first week.
  5. Make a checklist. One of the smartest things I did at the very beginning of each semester was to dissect the syllabus for all of the scheduled assignments and grade breakdowns. I would put the results into an ordered checklist spreadsheet (like this one for ML), so all I would need to do would be to complete one item at a time all the way down the list, and ipso facto the course work would be done!
  6. Create flashcards. This may seem excessive, but it's the absolute best way to study for exams and to remember what you want to from your courses. I've discussed SRS systems and learning methods at length in this blog already, so I'll leave the justifications there. I'm still reviewing cards today, and consider these one of the most important takeaways from my three years of learning in addition to the degree itself.
  7. Timebox. I've also written about timeboxing on this blog, but I'll mention that being able to work in my flow state for short periods of time, followed by recharging breaks, may be a "hidden" hack that kept me sane during these years. The pattern that ended up working best for me was 30 min. on / 10 min. off, and for difficult semesters I gave myself goal numbers of timebox sessions to hit for each day according to my unschedule in order to reach 20 hours each week.
  8. Schedule relax time. As absurd as it sounds, scheduling 15-20 minutes each night to unwind before bed could compliment your timeboxing to keep you sane. I didn't always keep this goal like I should have, but when possible I would do something like read or play video games that made multitasking impossible.
  9. Study ahead. Depending on the course, some portion of the material will be available from day one, so it may be beneficial to work ahead. If you really anticipate a time crunch during a given semester, you can attempt to watch all the videos on Udacity before the semester begins (and hope they haven't been updated anew).
  10. Always watch office hours. You never know what sort of details and hints they will drop about the assignments.
  11. Read instructions before reading the forum. A lot of people posting questions on the forum haven't read the instructions carefully enough, so give it a shot on your own first before you run into an actual problem.
  12. Choose project teammates early. If you are given the chance to create your own team for your project, post ASAP so you can form a team with other people who are on top of their game.
  13. Keep schedule expectations low. If my own life description were any indication, you'll want to clear your schedule to make as much time as possible. However, I will say this: don't neglect your own health or the people who support you.
Now go out there and meet your own dreams!

Tuesday, August 25, 2020

Reflections on a Master's in Computer Science - pt. 1/2

Hello friends! It's been a while. Three years, in fact, since I became a recluse to focus on graduate school studies, part of my four year journey into learning Computer Science. Well I'm still alive, and after 1879 additional flashcards (for a total of 4010 CS, IT, and math cards), roughly 2332 hours of studying, and $7,929.00 in tuition costs ($4,625 of which was covered by tuition reimbursement through employment), mostly while moonlighting with full-time employment in IT and programming, you can finally call me a Master of Computer Science!
  1. Earn IT certifications.
    1. CompTIA A+ Training Birthline: Sunday, May 29, 2016
    2. CompTIA A+ Training Deadline: Thursday, July 21, 2016
    3. CompTIA A+ 220-901 Certification Exam: Friday, July 22, 2016
    4. CompTIA A+ 220-902 Certification Exam: Friday, July 22, 2016
    5. CompTIA Security+ Training Birthline: Monday, July 25, 2016
    6. CompTIA Security+ Training Deadline: Sunday, August 14, 2016
    7. CompTIA Security+ SYO-401 Certification Exam: Monday, August 15, 2016
  2. Find an entry-level IT job (ideally with exposure to programming).
    1. Job Search Birthline: Monday, August 22, 2016
    2. Job Search Deadline: Monday, January 09, 2017
  3. Take pre-requisite courses online while learning programming on the side.
    1. Pre-req Birthline: Monday, August 22, 2016
    2. Pre-req Deadline: Sunday, May 07, 2017
  4. Apply to grad school.
    1. Application Birthline: Sunday, February 12, 2017
    2. Application Deadline: Sunday, March 12, 2017
  5. Increase professional programming experience.
    1. Job Search Birthline: Tuesday, July 11, 2017
    2. Job Search Deadline: Monday, August 28, 2017
  6. Get Master's degree.
    1. Program Birthline: Monday, August 21, 2017
    2. Program Deadline: Saturday, August 1, 2020
  7. Profit.
    1. 2020

How I Chose My Master's Program

The dream to earn my Master's goes back to May 21st, 2016 (before I had started learning my first line of code) when I defined my premise as "Most well-prepared and well-paid computer scientists have a related degree." To that end, my goal became "I will prepare for a Master's program in Computer Science" and after fulfilling the pre-requisite courses... yada yada yada I was accepted into all three schools that I applied to. As I outlined in this post, I ultimately chose to go with Georgia Tech's Online MS CS program (hereafter OMSCS) for the following reasons, which are (mostly) still relevant today:
  • The program is among the top-10 16 in the nation (#9 #8 U.S. News & World-Report#5 #16 THE World University Rankings)
  • The university is reputable and well-recognized in the engineering field, providing valuable degrees
  • The OMSCS program is accredited and utilizes cutting-edge tech, in order to maintain GT's strong reputation
  • The estimated $6,600 $7,000 tuition (higher if taking one class at a time) is not "too good to be true;" it's kept low to attract a wider applicant pool and to drive revenue indirectly, and the program can scale easier than traditional programs by using automation
  • The online courses are of higher quality and more challenging than traditional online colleges, inspired by the MOOC platform to successfully merge theory with hands-on experience, providing plenty of feedback and support to students along the way
  • OMSCS has a global presence and alumni community with supportive and enthusiastic students, rather than being centered in just one location
  • From GT's website: "The College of Computing's goal is to have the OMS CS program reflect the on campus MS CS program. Thus, the OMS CS degree is designed to be on par with degrees received in traditional on-campus settings. The curriculum in the OMS CS program represents a subset of the on-campus curriculum, allowing for a full MS in computer science but with only some of the specializations available in the on-campus program. The OMS CS curriculum will expand as more courses come online."

Overall Thoughts on OMSCS

I came to this online grad program at Georgia Tech with some prior experience taking online undergrad courses at UMGC (formerly UMUC) to complete a minor equivalent in CS. My overall impression of those UMGC courses was that they were "online courses for the motivated self-learner, but lacking quality control in teaching and student interaction." I aced all 8 classes and got into grad school, but it wasn't without a couple of regrets: 1. I should have kept schedule expectations low outside of school and work, and 2. I should have properly prepared for some of the courses. Taking what I had learned from UMGC and based on my own research of OMSCS, I was optimistic that I would be able to succeed at Georgia Tech.

I'm happy to report that I did achieve some measure of success (with a 3.70 GPA) and that OMSCS obliterates other online programs in quality - in addition to some offline courses from my undergrad days. For a $7,000 graduate program you would expect them to cut some corners, and from my perspective those corners include 1. individualized instructor involvement, 2. in-person networking opportunities, and 3. course numbers rivaling on-campus programs. These are, naturally, complaints you could raise about nearly any online program that simultaneously teaches nearly 500 students per class per semester. But on the whole, offering structured yet flexible distance learning for the average working professional is a benefit for the educational process of OMSCS rather than a detriment.

It's difficult to define a "basic structure" for OMSCS courses, because to its credit each course is formatted based on that professor's teaching strategy rather than adhering to some cookie-cutter template. For instance, some courses assign textbooks to supplement the lecture videos, and others rely entirely on lecture videos to convey learning materials. Some courses have individual assignments due every other week, and others have one large group project that spans the entire semester. Some courses autograde coding assignments upon submission, and others hand-grade written assignments. This variety is usually a good thing, but it means the vices of the professor's teaching will shine through as well and could lead to issues like inconsistent pacing or an overwhelming workload. However, if I were to lay out a basic structure, it would be this: watch lecture videos, read deeper material, participate in the student forums, complete smaller coding assignments or papers, work on larger individual or group projects, and take exams.

The lecture videos have ultimately moved away from Udacity to an internal platform, but you can still watch existing videos for free. They're usually interesting (if the professor isn't monotone) and are split into easily-consumable five minute or less videos, taking advantage of pre-recorded scripts and visual cues that nail the core concepts. The reading material comes in the form of textbooks, articles, and/or academic publications. This is usually... not as interesting as the videos. Some of the material is dated (think pre-2000s) with the justification of "getting the basics" - you'll get those basic concepts, but the examples may not be as relatable. The student forums (Piazza) are actually decently good at encouraging student interaction without forcing it. That is to say, courses hardly every mandate a "participation grade," and when they do it's not to require students to arbitrarily post x number of times per week (which I hated about UMGC). I would skim threads to see if there was anything interesting, post if I felt comfortable answering a question for a fellow student, and then actively search for answers to areas I was struggling with. Student responses often uncover answers much quicker and sometimes to much greater depth than instructor responses. As a way of networking, however, this system still leaves a lot to be desired. The exams come in a variety of formats, from multiple choice to puzzles and brain teasers loosely based on concepts from the material. Some are open note that must be returned by a deadline, and others are closed note that are proctored by webcam over a two hour period. Exam taking is a skill in itself, and even though I usually do fine I kinda wished for other evaluation methods.

The assignments and projects are where OMSCS really shines. This was easily the area that I was challenged, consequently learned, and ultimately enjoyed the most in each of the courses, and I list all of their descriptions proudly on my LinkedIn profile. I only had one course (Human-Computer Interaction) where all the projects were written, while the rest required a degree of coding in some or all assignments. The projects range from demanding to incredible frustrating, often contributing to countless hours spent in the middle of the night leaving me teetering on the edge of sanity. But I reluctantly admit that they are all doable, and once you figure them out you are on the top of the world. I had three group projects, two of which represented a significant portion of the course. Despite the potential disastrous downsides, my groups were without exception fantastic. My teammates were all motivated to put in the effort, and the work was more or less split evenly according to people's preferences and abilities. Obviously this will not be everyone's experience and I consider myself lucky, though I think it shows that the program attracts a significant number of driven individuals.

The professors have a commanding grasp of the material and their passion frequently shines through in their lectures and teaching strategies. It has none of that BS "substitute professor" phenomenon of UMGC (even despite a couple courses being taught while the professor was on sabbatical). That being said, some professors are more active in their online courses than others. Some offer weekly office hours where they answer student questions in video format, others are active on the Piazza forums or in the dedicated Slack channel, and still others you may only see in their pre-recorded lecture videos which is... unfortunate. But in my experience, none display individualized attention when a student is struggling or particularly interested in a certain area. Instructor work is supplemented by TAs (teaching assistants) who are much more active in answering forum and chat questions. Their primary role is often to grade assignments and provide feedback, but this can be frustratingly slow at times especially for students considering dropping a course by the deadline. Some TAs act as mentors in certain courses to oversee your individual or group work on a project, and I hear this can ruin the course for some students but my experiences here have also been mostly positive. The negatives for me largely arose from the occasional TA being flippant and unhelpful on the forums.

At the end of the day, you're entering OMSCS to learn some new CS skills and get a fancy piece of paper. The program delivers on both of those, and though I'm still awaiting the latter in the mail I truly believe that my knowledge on software and design cycles, databases, networks, security principles, and more have provided a theoretical and often practical underpinning in each of my professional roles that cannot be overstated. My education on data science disciplines such as AI and ML prepare me for future roles and transitions in the industry. Even after taking an entire graduate course on a subject, there are times when you'll want to go deeper on certain areas but the schedule moves on. However, as any language learner will tell you, school shouldn't be responsible for teaching you everything - once you're armed with the basics, you'll be in a better position to learn the details much more effectively on your own or on the job.

Read on to part 2, where I describe the courses I took, conditions on recommending the program, and pro tips!

Tuesday, June 25, 2019

Securing Your First Job in Software 7: Ask Your Value Questions

This post is part of a short series on actionable steps in acquiring your first developer job, which I utilized in 2018 2019 to become a Software Development Engineer with a major cybersecurity company again!

Special bonus blog!! Recently when I was applying to jobs, I was asked in passing by a job coach whether I had been reflecting on my own values when considering positions. "Uhh, no..." was my response at the time. But it got me thinking. What did my IDEAL position and company look like? What did that say about my values that underlay those qualities? And how could reflecting on those values provide a rating system that I could use to evaluate opportunities and compare them against each other?

This is an advanced step when it comes to job searching. A lot of times we have a vague idea that we want such and such job that utilizes such and such skills, but when it comes to asking them questions during the interview we come up blank. This doesn't have to be difficult; in fact, all I did to start was set a timer for 15 minutes, close my eyes, and start typing in a note on the following topic - what is my ideal position and company at this stage in my career?

At the end of those 15 minutes, I went through my free association mess and teased out specific questions that either I could ask a recruiter, I could find in a job description, I could ask an engineer during an interview, I could ask management during an interview, or I could research and figure out for myself. You don't have to categorize them right away, but you may find that some questions just naturally go together in a common theme. And before you know it, you have a list of value questions that you can prioritize and use to evaluate your opportunities! It's a beautiful thing. Let me share some general ones that I thought of.

Value Questions


  • Does the position align with my existing technical skills? Is this a Software Engineer or Software Developer role? Are the primary languages Java, Python, or AngularJS JavaScript? Are their expectations reasonable for me on a daily and monthly basis?
  • Does the position offer opportunities to learn or develop cutting edge tools? Are there other languages or tools that I’ve heard used in the industry that this position would give me the chance to learn? Can I continue to develop skills that I already started? Do they use an Agile development process? Do they use IDEs with syntax checks and debugging, rather than strictly command line VI or VIM? Are they open to experimenting with new tools without disregarding tried-and-true methods? Do they offer trainings or certifications to become proficient in new skills?
  • Does the position offer project flexibility? Do I have the chance to try new tasks and put myself outside my comfort zone every few months, avoiding a situation where I would be stuck on a single project for years on end?
  • Does the position address a market need that the company is allocating resources for? Is the work challenging and engaging, with real deadlines? Are they striving to create outstanding products that people need? Is the company mission aligned with its work?
  • Does the company fit my busy schedule? Is the location within 30 miles of [LOCATION]? Are hours flexible and allow me to commute outside of rush hour? Do they fit a “family-first” approach and encourage work/life balance to meet my other obligations? Are extreme deadlines and/or overtime (and stress) very very rare, even if with occasional defects or during product releases it’s unavoidable? Is traveling very very rare?
  • Does the company fit my mobile lifestyle? Do they offer opportunities to work remotely, around 1-2 times per week after the probationary period?
  • Will the position still be available for years to come? Is this a direct hire permanent position? If it’s contract-to-hire, are placement rates near 100% while allowing for extraneous circumstances? If it’s a contract, is there funding for multiple years, with a very low likelihood of the prime changing hands; if it does change hands, would my position disappear? If it’s private-sector, are the company financials and/or stock doing well with no recent layoffs?
  • Does the company/contractor offer benefits toward my goals? Is there tuition reimbursement with 6 months or less obligation afterwards? Is there a health and wellness reimbursement for gym memberships?
  • Does the company operate in an intriguing subject matter? Is it in the Cybersecurity or Health Informatics fields? If not, is the interest still approachable?
  • Will the company and position set me up for future success? If the field is Cybersecurity, is the experience I would get applicable to other fields too? Will I get exposure to Interactive Intelligence elements such as AI, ML, and HCI? Is the company well-known? Is there advancement within the company?
  • Does the company seek talent with a wide perspective? Are a variety of genders, ethnicities, and generations represented in the office, and ideally on my own team?
  • Does the position allow me to learn from my teammates? Do I like my teammates? Are most of my teammates experienced engineers? If the company offers remote options, will I still have frequent opportunities to interact with my team in person? Are my teammates comfortable with me asking them questions (especially in the beginning)?
  • Does the company offer a relaxed atmosphere? Can I wear jeans and a T-shirt? Are there other office perks, like a ping-pong or foosball table or free food? Am I not meeting customers face-to-face on a frequent basis, which would require more business attire?
  • Does the position offer a competitive package? Can I negotiate a salary bump? Is there a good overall benefits package?
  • Does the company employ individuals who WANT to be there? Do employees love the company for the same reasons I might? If I am replacing someone, did they leave under positive circumstances? Has there not been a mass exodus lately?

Saturday, May 11, 2019

Securing Your First Job in Software 6: The Technical Interview

This post is part of a short series on actionable steps in acquiring your first developer job, which I utilized in 2018 to become a Software Development Engineer with a major cybersecurity company.

Congratulations! If you've followed the suggestions in my original post and first five in this series, then you likely have all the information, tools, and confidence you need to make it to an interview. Now you just need to kick some ass. But unlike many other fields, the technical field has one last small hurdle to overcome and own: the technical interview.

Practical Interview Prep

Here's what you should be doing before every interview to prepare your technical skills:

  1. Print out the job description
  2. Go through line by line and highlight or underline everything that you're even slightly unsure about
  3. Research each of those tools or concepts, and take notes on a blank sheet of paper
  4. Consider creating a small project that utilizes what you researched
  5. Review your notes until you feel confident explaining them during the interview

Cracking the Coding Interview

My tips in this area will only take you so far, but I have a suggestion if you want to upgrade your skills to the elite level: buy this book. This was written by Gayle Laakmann McDowell, who has worked as a software engineer at Google, Microsoft, and Apple, and has insights into the hiring practices of other top tech companies like Amazon as well. She has tips on what to learn before applying to jobs, what the process will look like at each of the top tech companies, how to approach coding questions, how to create a resume that stands out, what questions you should expect to be asked, how to handle job offers, and even a two-page sample preparation road map. And that's just the introduction. Totally worth it.

Technical Interview Sample Questions

These are all the questions that I recall being asked during technical interviews. Your questions are almost guaranteed to be different, but this should give you some sense of what you're expected to know as an entry-level developer.

  1. A provided code snippet that I was asked to "explain at a high level"
  2. A business scenario that I was asked to depict in an entity relation diagram (not the relationships or attributes, just core entities and how they relate to each other)
  3. A question about whether a specific language can utilize public/private access control for classes and functions
  4. A question about files that are generated after compiling
  5. A question about lambda functions
  6. A scenario that involved coming up with a class of my choice in a specific language, with a constructor and two methods to operate on the object, from scratch on the whiteboard in front of three senior engineers (not my strong suit)
  7. A question about generics
  8. A question about caching data to avoid excessive DB transactions
  9. A question about overriding/overloading
  10. A question about passing arguments
  11. Multiple questions about threads
  12. A question about serializing a class
  13. Multiple questions about maven and pom.xml file contents
  14. A question about wrappers
  15. A question about constructor types
  16. A question about singleton classes
  17. A question about polymorphism
  18. A question about interfaces and abstract classes
  19. Multiple questions about relation indices
  20. A question about storing passwords in variables
  21. A question about string immutability
  22. A question about wait and notify methods
  23. A question about hash maps vs. hash tables
  24. A question about the final keyword in Java
  25. A question about the lifecycle of a Spring bean factory
  26. A question about abstract classes vs interfaces
  27. A question about loops
  28. A question about OOP vs. scripting
  29. A question about using Spring
  30. A programming task to complete a LinkedList
  31. A question about Docker uses
  32. A question about asymmetric vs. symmetric cryptography
  33. A question about asynchronous programming
  34. A question about lists vs. sets
  35. A question about Spring Boot vs. Spring (Core)
  36. A question about Spring annotation differences
  37. A question about creating and using a Spring bean
  38. A question about hash map restrictions
  39. A question about the maven clean command
  40. A question about using JPA in Spring
  41. A question about accessing databases using Spring
  42. A question about Spring bean scopes
  43. A question about Spring Security
  44. A question about Angular vs AngularJS
  45. A question about creating a Dockerfile from scratch

Remember, the only job security in the modern era is having the skills to be re-hired. Godspeed, applicants!!!

Read on: 7: Ask Your Value Questions

Other posts in this series:
Securing Your First Job in Software 1: Register New Contact Info
Securing Your First Job in Software 2: Update Your Resume
Securing Your First Job in Software 3: Practice Your Pitch
Securing Your First Job in Software 4: On Recruiters
Securing Your First Job in Software 5: Optimize Your Online Search Securing Your First Job in Software 7: Ask Your Value Questions

Friday, May 10, 2019

Securing Your First Job in Software 5: Optimize Your Online Search

This post is part of a short series on actionable steps in acquiring your first developer job, which I utilized in 2018 to become a Software Development Engineer with a major cybersecurity company.

As I mentioned in my original post, this ain't no one-man show; we all depend on the support of people around us to make it somewhere in life. This isn't cheating, it's a fact. When looking for employment, preference should always be through personal connections first, be them family, friends, acquaintances, job fairs, or even recruiters. If you keep your job search a complete secret, you might as well accept the fact that it's going to take you much, much longer to make those connections. Having said that, there comes a time when you'll need to step out and start applying to positions you find on your own rather than sitting around waiting for the perfect opportunity to come to you.

Search Criteria

Inputting the following search criteria on job search sites yielded the most relevant results, in my personal experience. Obviously your criteria will differ, but consider this a starting point that you should keep notes on.
Keywords (separated by "or" in one long string): "software" or "java" or "python" or "android" or "programmer"
Not (prefaced with "NOT" on some sites): NOT "TS/SCI" or "clearance"
Categories: IT and Software, Information Technology, Technology
Job Titles: Software Engineer, Software Developer, Java Developer, Python Developer, Android Developer, Programmer
Location: 10-15 (max 30) miles or less from zip code
Hours: Full-time

Tracking Progress

I keep a Google Sheets spreadsheet to track all applications that I send out. Why? A better question is, why not? This way I can see at a glance all the relevant information for a job posting that I'm applying to: Company, Position, Location/Distance, Found (where?), Applied (when?), Follow-up, Skills, Pay, Contact (name), Phone, Email, and Site. Then I can add regular status updates as I follow-up and even highlight the rows in different colors depending on how far along I am (called or emailed back, interviewed, offered, etc.).


Best Websites

In my original post I suggested a ton of sites to sign up for and start searching on (CareerBuilder, Indeed, Monster, Washington Post Jobs, Idealist, and Craigslist). But when I actually stepped back and did an 80/20 analysis on which 20% of sites were leading to 80% of applications, I was surprised to find that I can narrow down this list by a LOT.
Best sites to search for jobs on: Indeed, LinkedIn (try their Easy Apply feature), and (if you have a degree from a local university) your alma mater's career portal
Best sites to list your resume on (and wait for calls): CareerBuilder (though this gets overwhelming at a certain point and you may want to turn it off), Dice, and Indeed Prime (I know it sounds premium, but it's free)
I honestly had very little luck anywhere else. Or, you could just target companies and apply through their websites.

Godspeed, applicants.

Read on: 6: The Technical Interview

Other posts in this series:
Securing Your First Job in Software 1: Register New Contact Info
Securing Your First Job in Software 2: Update Your Resume
Securing Your First Job in Software 3: Practice Your Pitch
Securing Your First Job in Software 4: On Recruiters
Securing Your First Job in Software 6: The Technical Interview
Securing Your First Job in Software 7: Ask Your Value Questions

Thursday, May 9, 2019

Securing Your First Job in Software 4: On Recruiters

This post is part of a short series on actionable steps in acquiring your first developer job, which I utilized in 2018 to become a Software Development Engineer with a major cybersecurity company.

You should be proud of your progress thus far! You have not only purposefully summarized your education and experience but can advertise yourself, and the latter alone is an important skill. A necessary skill, but not always sufficient for job searching and placement. With so many potential companies and positions out there in the sea, how can you find and get the attention of the best fish no matter where they swim? Sometimes you need to enlist a professional fisherman recruiter.

What's a Recruiter?

Ostensibly, a recruiter is someone who helps place candidates in agreeable employment positions, by reviewing their experience, negotiating their salary, and advocating to potential employers on their behalf. There are various types of recruiters, but the ones you'll likely encounter the most at this stage of your career are external contingency recruiters; employed by external companies and contracted by candidate-seeking employers, these recruiters get paid around 25% of the successful candidate's salary for the first year. Don't worry, this doesn't come out of your pocket, it comes from your employer - but it's important to know their motivation.

Expect to get a LOT of calls from recruiters, especially after setting up your contact information and visiting job search sites (yet another reason to rent a phone number). In fact, I think recruiters have access to stats that include how recent a profile was updated. Which is a good thing while you're searching because, despite the slim chance that any one recruiter will find you your dream job, it will at least give you practice in explaining your situation and the positions you're looking for. Decide your job title, your desired responsibilities, the type of work (contract vs. private), the max distance you're willing to commute, and your lowest pay UP FRONT. They will ask, so be honest with them because they're (supposed to be) advocating for you.

One thing in particular to decide your stance on is "Contract-to-Hire" - a popular hiring practice that recruiters often utilize. Basically, you work for six months as a contractor with the possibility of "going perm" and becoming a full employee at the company afterwards. This means you're doing a six month contract through the recruiting agency (in other words, you're their employee and get pay and benefits from them) and there's no guarantee you'll have a job afterwards. That could be great for getting your foot in the door, but it offsets the company's risk onto you; unless your performance is outstanding and they love you (and they have the resources), they won't want to keep you. Sure, if you do badly at any company they'll end up firing you, but there's nothing stopping these companies with six month contracts from setting the bar unreasonably high. Sometimes this works out great, but keep these points in mind as food for thought lest you're caught unaware.

The Bad

Here are three methods for dealing with bad recruiters:
  1. Often times you will get calls asking to do the same job you're working now (even if you're trying to advance), to pack up and move somewhere you couldn't care less about, or to work for less money than what you're currently earning - just say NO. Then they have the audacity to ask you to recommend them to friends and family who may be looking for jobs? Hell no.
  2. Be skeptical if you get a call out of nowhere, to set up an interview for the next morning, which leads to a job offer that same day, especially if you were "meh" about your performance. These recruiters are trying to make a quick commission buck, and will disappear as quickly as they arrive.
  3. If you're told that your current experience won't be enough to land a job and/or your desired salary, don't be afraid to stand confident and firm in what you want. You'll have plenty of opportunity to prove them wrong.

The Great

The great recruiters will do one thing above all others - listen to you. They'll respect your wishes when you say, "I don't want six month contract-to-hire jobs," "I want to work in private companies," and "I want positions with projects utilizing a variety of programming languages." And instead of dropping your case when it narrows down your possibilities, they'll double down and keep in regular contact, eventually getting you interviews with potential employers. If they can do that much, then you know you've found a winner. In my experience, I've found some great technical recruiters through OPTOMIAerotek. and TEKsystems. Ideally you would go in person to their offices, but I only ever spoke with them over the phone.

The best of the best are the legendary recruiters you hear about through word of mouth in your network. More so than recruiters, they are like job search coaches who take the time to train you on how to phrase your experiences and highlight the strengths that employers are most interested in. They can arm you with tremendous professional insights into the hiring process and syke psych up your own confidence in yourself, while simultaneously reaching into their deep network of contacts to find available positions that meet your criteria. If you find this type of recruiter, thank whoever put you in contact with them profusely, and take full advantage of the opportunity.

BONUS: Here are two more tips I recently learned.

  1. When recruiting calls/emails get overwhelming, have a script. Eventually, you'll get to the point where you just don't want to pick up your phone lest you fall into another 15 minute conversation that ends with, "wait, you want me to work where?! No thank you." That's when you employ a script. It can be as simple as this:

    Phone: Are you looking to fill a non-clearance Software Engineer position in the [LOCATION] area?

    Email: Thank you for reaching out. I am interested in Software Engineer roles that utilize Java, Python, or AngularJS JavaScript (though I’m happy to learn more) in the [LOCATION] area. Primarily I’m looking for full-time direct hire positions (not contract-to-hire unless placement rates at the company are 100%) that don’t require a clearance. Is this aligned with any roles that you’re looking to fill?
  2. If recruiters ask for details on your own job prospects, they're transactional. A lot of times recruiters will ask how your job search is going, and god help you if you tell them you have an interview lined up. If they press you for details on these companies, they're most likely doing it for one of two reasons: they'll want to submit someone else for the same role (i.e. competition), or they'll want to swoop in and take credit for submitting you (i.e. leachers). You don't need these recruiters in your life, just say "I can't give out that information" and run in the opposite direction.


Godspeed, applicants.

Read on: 5: Optimize Your Online Search

Other posts in this series:
Securing Your First Job in Software 1: Register New Contact Info
Securing Your First Job in Software 2: Update Your Resume
Securing Your First Job in Software 3: Practice Your Pitch
Securing Your First Job in Software 5: Optimize Your Online Search
Securing Your First Job in Software 6: The Technical Interview
Securing Your First Job in Software 7: Ask Your Value Questions

Wednesday, May 8, 2019

Securing Your First Job in Software 3: Practice Your Pitch

This post is part of a short series on actionable steps in acquiring your first developer job, which I utilized in 2018 to become a Software Development Engineer with a major cybersecurity company.

You now have polished skills attached to your name and a way to be contacted. The next step is convincing potential employers to care enough to look at your resume (or at least, you know, process it through that keyword matching algorithm) - and it comes down to your 30-second elevator pitch. Perhaps this is in-person at a job fair or online with a short cover letter. I've included examples I used for each. Craft your own and practice, practice, practice until you can say the in-person version in front of a mirror without any notes.

In-Person Example

Hi, my name is Greg, I'm a UMBC alumni and a first year computer science graduate student at Georgia Tech. I work part-time as a Software Engineer and full-time as an IT professional. I have programming experience in Java and Python and I'm interested in Interactive Intelligence as well as the intersection of health and tech. In particular, I'm looking for an opportunity to expand my software development career with a private sector entry-level position in the [LOCATION] area. Is this aligned with any roles you're looking to fulfill?

Online Example

[DATE] 
Dear [COMPANY] Recruiting Manager, 
As a software engineer and computer science graduate student, I was excited to find your opening on [WEBSITE] for a [POSITION]. I would be a great addition to your team because I can [OBLIGATIONS], based on my core programming knowledge obtained through education and self-study, and my diverse technical skills learned through experience in software development and IT. I am interested in developing my career in software and learning more about [INTERACTIVE INTELLIGENCE / THE INTERSECTION OF HEALTH AND TECHNOLOGY / PERSONAL INFORMATICS / ETC.]. 
It would be inspiring to work with a company that [INTERESTING FACTOID]. My resume is attached for your consideration. Thank you for your time to review my application, and I hope to have the opportunity to discuss the opening with you in person soon.
Godspeed, applicants.

Read on: 4: On Recruiters

Other posts in this series:
Securing Your First Job in Software 1: Register New Contact Info
Securing Your First Job in Software 2: Update Your Resume
Securing Your First Job in Software 4: On Recruiters
Securing Your First Job in Software 5: Optimize Your Online Search
Securing Your First Job in Software 6: The Technical Interview
Securing Your First Job in Software 7: Ask Your Value Questions

Tuesday, May 7, 2019

Securing Your First Job in Software 2: Update Your Resume

This post is part of a short series on actionable steps in acquiring your first developer job, which I utilized in 2018 to become a Software Development Engineer with a major cybersecurity company.

Now that your contact methods are in order, it's time to update your resume, effectively attaching your skills to your name. The purpose of hiring isn't usually to get the right people - it's to avoid getting the wrong people. One bad hire (false positive) is worse than five good hires, so companies would actually prefer to miss out on great talent (false negatives). In other words, they're looking for any reason to disqualify you.

Keywords and Robots

The first hurdle is getting past a simple keyword matching algorithm. Most companies use these, so to a certain extent a resume can make headway simply as a disjointed scramble of buzz words. Now I'm not advocating that you go out and start removing all coherent sentences, but you should be conscious of including as many languages, frameworks, tools, operating systems, certifications, and key concepts as you can. Even better would be to make sure all major keywords in a given job description are reflected in the resume, which is why some resume coaches encourage tailoring resumes to each position (if you took my advice on keeping your master data on LinkedIn, this should be easy to do). I put these in a "Skills" section, and recently moved that to the top of my resume.

Human Screening

When your resume first reaches human eyes, you have approximately 10-15 seconds to convince the recruiter that you're a likely fit based on technical competency. This should give you pause when considering to go longer than a single page (try one page per 10 years of experience, or one page per degree), or to include long paragraphs of text. Instead, you should articulate in an easily readable way how you can help the companies get what they want. Here are three ways to making your resume more appealing:

  1. Replace the Objective section with a job title. It may be hard to accept at first, but whatever you put here can be summarized as "to get a job" and everyone already knows that, so without it you'll have more room for other sections. One thing you can try adding instead is simply the job title of the position you're applying to.
  2. Supplement your lack of experience with a Projects section. This can be 2-4 of your strongest recent projects, be them course-based or independent, solo or with a team. Be sure to write a brief description of each project along with the languages and tools you used. If some of these projects are on your GitHub account, consider including the link at the top of your resume as well. If you can't think of any projects you've worked on, go out there and BUILD SOMETHING!
  3. Make all experiences measurable and use exact numbers wherever possible. This shows your technical nature and willingness to quantify your accomplishments. Here is an easy algorithm to follow when writing your experiences: "Accomplished X as measured by Y by doing Z."

Phone Screen and Beyond

The purpose of a resume is to get a phone screen, at which point some 90% or more of resumes have already been weeded out. The purpose of the phone screen is to get an interview. And by the time you get an interview, you know that the company considers you as a potential employee and you're already more than qualified to handle the obligations. It all starts with the resume.

From here, it's best to see the resumes of as many computer scientists as you can for inspiration. I'll start you off with mine, which is the exact resume I used to jump straight to the onsite interview that got me my job:

Godspeed, applicants.

Read on: 3: Practice Your Pitch

Other posts in this series:
Securing Your First Job in Software 1: Register New Contact Info
Securing Your First Job in Software 3: Practice Your Pitch
Securing Your First Job in Software 4: On Recruiters
Securing Your First Job in Software 5: Optimize Your Online Search
Securing Your First Job in Software 6: The Technical Interview
Securing Your First Job in Software 7: Ask Your Value Questions

Monday, May 6, 2019

Securing Your First Job in Software 1: Register New Contact Info

This post is part of a short series on actionable steps in acquiring your first developer job, which I utilized in 2018 to become a Software Development Engineer with a major cybersecurity company.

Greetings fellow green horn job seekers! When it comes to tech jobs the market demand has never been higher, but the willingness on the part of companies to train newbies can - frustratingly - feel inversely proportional to that demand. Once you have those marketable skills, you will have modern "job security." I previously wrote a post with general steps for getting your foot in the door with IT, or any new career. This series will build on those steps with additional tasks you can focus on that are within your control, and together this can increase your likelihood of being recognized by hiring managers. The first step: streamline your contact information.

Email

If you somehow made it here without owning a single email address... I applaud you, I honestly have no idea how you survive in this world. For everyone else, it's quite possible that you have multiple addresses, and are equally likely to be firmly against creating yet another one. But allow me to offer an argument in favor of doing so:

Having a separate email address (such as with Gmail) strictly for communicating with potential job prospects can offer the freedom of handing out your address at any public networking opportunity, without sacrificing the day-to-day strain of filtering through extra spam and recruiters you could care less about - especially once you're comfortably in a position you love. The point isn't to add yet another account to sign into and check, but to take advantage of settings in providers like Gmail to forward ALL your mail to another address that you actively use. Then all you have to do is filter your incoming mail by the recipient "to" address, creating a rule to have all emails sent to your new professional address moved to a "Networking" folder (Gmail: Settings > Filters and Blocked Addresses). You can even send email AS that other address within your existing account (Gmail: Settings > Accounts and Import > Send mail as), which will provide the same capabilities on mobile apps as well (just select the "from" address before sending).

Phone

Like with email, you want the ability to give out your phone number to the world when networking for job positions without the repercussions of dealing with extra spam that could last months or even years afterwards. A great option for this is renting a temporary phone number, which Skype offers for a mere $6.50/month. Skype even includes a feature to forward all calls made to that number to another phone (presumably your actual mobile number) within one second of the call. The catch is that they still count and charge you (minimally) for minutes that are forwarded, so you either need Skype credit in your account or just get an unlimited subscription within the U.S. for $2.99/month. Still, $9.49/month for peace of mind ain't bad.

You can include this number on your resume, on job search sites, even on LinkedIn - basically everywhere you can while you're searching, and then stop the subscription when you find something. Just don't forget to give your new company your real phone number at some point or that could make things a tiny bit difficult.

LinkedIn

Though it's not my first choice for a fun social networking experience, LinkedIn is almost a necessity these days when you want to network publicly without giving out your personal accounts like Facebook and Instagram that may have, shall we say, "incriminating material" for potential employers and colleagues. In addition to email and phone, LinkedIn messages can be another valid method of contacting recruiters. I've spoken with professional LinkedIn Branding Artists (at least, I think that's their job title), and it turns out there are hundreds or even thousands of hours of learning material available in the form of sites and books and courses that will teach you how to improve your profile. I can only begin to scratch the surface, but here are just five things you can focus on to drive traffic to your account:
  1. Customize your public profile URL (see the setting in the top right) and stick it to the top of your resume
  2. Go ahead and put that shiny new email address and phone number front and center in your introduction
  3. In your headline, include titles for the job you WANT and major skills that you want to be recognized for by recruiters who are searching for great candidates, aiming for around 20 keywords: i.e. "Software Developer Engineer Programmer Computer Scientist Java JEE Spring Python JavaScript AngularJS HTML MySQL Agile"
  4. Your introduction (BEFORE expanding to see more) should include the summary highlights of your career. Then in the next paragraph, start "I began my career..." to tell the story of your professional life, and emphasize the work you want to help with: i.e. "I am excited to help develop software in the cybersecurity industry with my advanced education and agile programming experience"
  5. As I mentioned in the previous post, your profile should be a catch-all for organizing all of your work experience and information in one place, so you should actually start there when updating and refer to it when picking out the best and most relevant information for your resume. However some job coaching companies actually discourage including some personal information such as graduation dates because apparently identity stealing is a thing.
Check my LinkedIn profile for more details!

Friday, October 27, 2017

tl;dr: I Went From Homeless Outreach Case Manager to Software Engineer in 456 Days

(Hint: I didn't need to deliberately practice for all 10,944 hours)

Ahoy nakama! I'm Greg, Software Engineer and Computer Science graduate student. Mmm, I like the sound of those titles. I haven't always been A MAN OF SCIENCE. In fact, if we had met last year I would have introduced myself as "Greg, Case Manager for homeless individuals. Math? Technology? No ma'am/sir, 'fraid I ain't done none o' that since oh, high school over a decade ago." I suppose one can make a lot happen in 365 days, or in my case... 456. What can I say, I'm a slow learner. :(

On Sunday, May 29th, 2016 at the ripe old age of 28, I began learning Computer Science (aka programming, aka coding, aka modern wizardry). Since that time I've posted 13 blogs to document my plans to begin the challenge and my subsequent milestones along the wa-- huh, what's that? TOO MUCH READING?! Wow, you're almost as lazy as I am. You're the perfect candidate to change your life as well! Fine, I'll give you the cliff-notes version (believe it or not, the actual posts are longer) and you can thank me when you're stinkin' rich... with knowledge! :D But also money. Just promise to click through if you see something you like.

tl;dr

A note before going forward: I'm not saying that those in the mental health field should consider a career change, or that becoming a professional computer scientist will be the solution for everyone. BUT. In an era where technology is perpetually changing the game, be prepared to learn new things lest you watch your position or even your industry become obsolete. Do you need to be a genius to take control during this change and grow to proficiency in a new domain such as tech? BWAHAHAHAHAHA, no. Don't believe any computer scientist who puffs out their chest and tells you that you can't do what they do. It's just another human profession that we malleable humans can be trained for. Build up that confidence and...

Step 1: Declare the Dream!

I had reached a level of frustration with my life trajectory that necessitated questioning not whether I could or couldn't make it work, but "will I be able to live life WITH my family [JASMIN] to the fullest? And is it possible to support my family [JASMIN] while I'm on this difficult path before I even reach financial stability?" In that moment, I turned to an existing interest in technology that I could fuel with excitement for the challenge and develop into an impassioned skill, one that would increase my marketability now and open up business opportunities for the future. And thus, my Dream was born! It wasn't sufficient to just commit internally (though it was necessary) - I declared the Dream to the universe so people around me would hold me accountable. For good measure I blogged, tweeted, and insta'd, all of which were redirected to my fb feed. That's not to say I felt obligated to justify myself to everyone; proving through action is infinitely more rewarding than wasting time winning an argument (unless of course your Dream is to become a world-class argument winner). Once your brain fully embraces your Dream as an eventual reality, you must...

Step 2: Illustrate the Dream!

The hard part was complete. With the world as my witness, I had committed to my decision. But what the hell does "learning Computer Science" mean anyway? Where was the starting line, and how could I expect to run towards the finish line if I didn't even know where it was? I set my Dream Birthline and gave myself two weeks to research a clear, measurable plan - the WhatWhen, Where, Who, and How to supplement the Why. Let us review my n00b situation:
  • I have no professional background in tech (education or employment) and I currently work in the mental health field.
  • I work full-time (70 hours every 2 weeks, with every other Friday off) and intend to continue moonlighting while getting my degree.
  • I will hopefully get assistance paying for school to avoid racking up student loans, be that through scholarships, financial aid, tuition reimbursement, or family lending.
After long discussions with family and friends who were deep in the tech trenches and had accomplished similar Dreams, I started from premise #1 - "Most well-prepared and well-paid computer scientists have a related degree." I already had a Bachelor's (of the Arts variety in Philosophy and Psychology), so I didn't want another undergraduate degree, perhaps for reasons not entirely void of ambition. Therefore I came up with Goal 1: I will prepare for a Master's program in Computer Science. Note that the goal wasn't to "be accepted into" because that, my friends, is a passive action upon me rather than an activity that is within my control. To catch up with prospective applicants who already have experience and education, I needed to build up a technical background from scratch ASAP. Enter premise #2 - "Entry-level jobs are going to be quicker and much, much easier to obtain through IT than through coding, especially with just certifications." I found that CompTIA was the place to start with certs to get your foot in the door with IT, and that graduate programs emphasized fulfilling pre-requisites that earned credits rather than passing proficiency exams (more on these later). Fantastic, so the sub-goals had pretty much written themselves - Sub-Goal 1: I will work in IT (experience); Sub-Goal 2: I will prepare for applying to graduate school I will take pre-requisite courses while learning programming on the side (education).

They said my ideas were crazy. They said I'd never pull it off. It didn't bother me; I'd learn so much more from experimenting, failing, and proving through action than by getting worked up over hypotheticals. I leveraged what I already knew about myself and getting things done with time management techniques to outline exactly when, where, and with what advantageous identity I would be sitting down to make progress on my sub-goals. I created an Unschedule to consolidate my free time into 20 hours of Timeboxing the project each week, and came up with a Goal Calendar to work backwards and calculate monthly, weekly, daily, and RIGHT NOW aims to stay on track. Don't forget to reward yourself along the way to reinforce these productive habits. No matter the outcome, I always had a backup plan - if I didn't like IT or coding, I could continue my mental health job; if I didn't pass my certs, I could have delayed my coding classes and continued studying; if I didn't pass my coding classes or gotten into grad school, I could have expanded on my certs and switched to cyber security. But for the odds to be ever in my favor, right from the outset I would adopt the eye of the Tiger identify as a gifted programmer and behave as if I were already enjoying the thrill of success. Essentially, I became a new person: Tech Greg. 8-)

The last piece of the puzzle was breaking down HOW I would learn Computer Science material. Sure, I've tackled Japanesehealth, and Psychology in the past, but learning a "hard" scientific discipline must be different. Or must it? I analyzed past techniques in deliberate practicefun, an SRSmnemonicslearning-based note-taking, the 80-20 rule, and the Feynman method, and combined them into three basic steps (see post for more): Step 1: Understand (simplify), Step 2: Apply (projects), Step 3: Memorize (SRS/Anki). The point wasn't to follow the method to a T, but to go into the arena with a strategy in writing so I could test it and move on if it didn't work. SCIENCE, BITCH! Some individuals attribute a failed attempt to their character and not being "cut out for it," but in reality - your method just sucks, bro.

Using the plans above, I came up with an initial schedule:
  1. Earn IT certifications.
    1. CompTIA A+ Training Birthline: Sunday, May 29, 2016
    2. CompTIA A+ Training Deadline: Monday, July 4, 2016
    3. CompTIA A+ 220-901 Certification Exam: Saturday, July 9, 2016
    4. CompTIA A+ 220-902 Certification Exam: Saturday, July 16, 2016
    5. CompTIA Security+ Training Birthline: Sunday, July 17, 2016
    6. CompTIA Security+ Training Deadline: Monday, August 15, 2016
    7. CompTIA Security+ SYO-401 Certification Exam: Saturday, August 20, 2016
  2. Find an entry-level IT job (ideally with exposure to programming).
    1. Job Search Birthline: Sunday, August 21, 2016
    2. Job Search Deadline: Monday, September 19, 2016
  3. Study programming while working and preparing for grad school. Take pre-requisite courses online or at a community college while learning programming on the side.
    1. Pre-req Birthline: Fall 2016???
    2. Pre-req Deadline: Summer 2017???
  4. Shift to a programming job.
    1. TBD
  5. Apply to grad school.
    1. Fall 2017???
  6. By graduation, I'll have both education and experience.
    1. Spring 2019???
  7. Bam.
    1. 2020???
And here is the current schedule:
  1. Earn IT certifications.
    1. CompTIA A+ Training Birthline: Sunday, May 29, 2016
    2. CompTIA A+ Training Deadline: Thursday, July 21, 2016
    3. CompTIA A+ 220-901 Certification Exam: Friday, July 22, 2016
    4. CompTIA A+ 220-902 Certification Exam: Friday, July 22, 2016
    5. CompTIA Security+ Training Birthline: Monday, July 25, 2016
    6. CompTIA Security+ Training Deadline: Sunday, August 14, 2016
    7. CompTIA Security+ SYO-401 Certification Exam: Monday, August 15, 2016
  2. Find an entry-level IT job (ideally with exposure to programming).
    1. Job Search Birthline: Monday, August 22, 2016
    2. Job Search Deadline: Monday, January 09, 2017
  3. Take pre-requisite courses online while learning programming on the side.
    1. Pre-req Birthline: Monday, August 22, 2016
    2. Pre-req Deadline: Sunday, May 07, 2017
  4. Apply to grad school.
    1. Application Birthline: Sunday, February 12, 2017
    2. Application Deadline: Sunday, March 12, 2017
  5. Increase professional programming experience.
    1. Job Search Birthline: Tuesday, July 11, 2017
    2. Job Search Deadline: Monday, August 28, 2017
  6. Get Master's degree.
    1. Program Birthline: Monday, August 21, 2017
    2. Program Deadline: Spring 2020
  7. Profit.
    1. 2020
"How did you manage to conquer these milestones?!" you ask starstruck. Let's take a look...

Step 3: Experience Tech! ("Sub-Goal 1: I will work in IT")

It's ass kicking time. Even if your eventual goal is coding (as mine was), can you think of a quicker way than IT to get out of a low-paying growth-deprived job and into the tech world to network with like-minded nerds? With a few minutes of Googling, CompTIA distinguishes itself with globally recognized and accredited IT certifications for entry-level job seekers: CompTIA A+CompTIA Network+, and CompTIA Security+. Though A+ is the premier starting cert, I decided to set myself apart from the competition by obtaining a second, and Security+ not only fit neatly into my cyber security backup plan, it was frequently posted alongside A+ in local job listings. How do you obtain these certs? THAT'S THE SPIRIT! As of 2016, A+ required passing two exams: 220-901 and 220-902 ($199.00 each - $39.80 coupon code = $358.20), and Security+ required one: SYO-401 ($311.00 - $31.10 coupon code = $279.90). I scheduled my exams on their parent site Person VUE (typically Mon.-Fri. at local community colleges, etc.), and stuck with the deadlines. To prepare, I took the recommendation of a friend and used TestOut, which offers training (A+, Security+) at a $79/month subscription that includes videos, practice questions, and interactive labs all from your web browser. By tracking with 30 min. Timeboxing sessions, I completed the training in 124.75 hours and 954 SRS flashcards over a 2 and a half month period, which was enough to earn me passing scores on all three exams on the first try. CompTIA recognizes my A+ and Security+ certs as equivalent to two years of hands-on experience and effectively qualified me for entry-level IT positions. I've since added an additional cert to my belt for a triple-threat: ITIL.

Though building up competency was 2 and a half months on its own, it took me an additional 4 and a half months to land that entry-level IT position. For some inane reason, I had convinced myself that while working full-time, schooling full-time, fulfilling obligations as a husband, and being an adult, I'd also find the time to look for a new job... and study a little coding on the side, of course! As it turns out, getting a job is about WHAT you know, but people only care depending on WHO you know. On Monday, January 9th, 2017 I was hired as a Help Desk Support Services Specialist by a family friend, which places me in a government datacenter keeping an eye on servers and responding to client incidents. After taking much longer than expected, I had traded $875.10 in certification fees for a 50% increase in salary, that I'm proud to say could be covered entirely in a single month based on the salary increase alone. If you find yourself in a similar situation looking for work, here's a run-down of what I learned (see post for more): Step 1: Knowing your shit, Step 2: Getting your ducks in a row, Step 3: Making connections (MOST IMPORTANT), Step 4: Sending out applications, Step 5: Contacting companies, Step 6: Getting the interview, Step 7: Following-up.

Step 4: Learn Programming! ("Sub-Goal 2: I will take pre-requisite courses while learning programming on the side")

At last, I'm a tech professional getting into the CS field, rather than a complete n00b without work experience in computers to show off on my resume. Given that I wanted to apply for a Master of Computer Science (MCS) program, I researched 6 schools in my area or online that provided the strongest MCS or related programs and asked questions focused on preparation (see post). I put together a useful spreadsheet to get a clearer look at the pre-requisite courses, comparing MCS requirements on the left to equivalent courses at local colleges on the right. This data was enough to conclude that I would have the best shot at targeting 3 MCS programs by taking 8 undergraduate courses at the online University of Maryland University College (UMUC) over the Fall 2016 and Spring 2017 semesters. I was confident that I could get graduate programs to mitomeru my skills!

I enrolled in UMUC and took their accelerated 8-week semesters according to the following schedule, so as to nail down that scientific and mathematical mindset and to learn core concepts that underpin Computer Science as a discipline:

2016 Fall Online Session 1 (8/22-10/16)
  1. MATH 140: Calculus I (4 credits)
    1. Pre-reqs: MATH 108 or MATH 115
    2. aka Pre Calc (passed AP exam in high school)
  2. CMIS 310: Computer Systems and Architecture (3)
    1. Pre-reqsCMIS 115, CMIS 125, or CMIS 141
    2. aka Java proficiency
2016 Fall Online Session 4 (10/24-12/18)
2017 Spring Online Session 1 (01/09-03/05)
  1. MATH 141: Calculus II (4)
    1. Pre-req: MATH 140
  2. CMSC 350: Data Structures and Analysis (3)
    1. Pre-reqs: CMSC 150 and CMIS 242
    2. aka Java proficiency
2017 Spring Online Session 4 (03/13-05/07)
  1. CMSC 330: Advanced Programming Languages (3)
    1. Pre-req: CMSC 230 or CMSC 350
  2. CMSC 451: Design and Analysis of Computer Algorithms (3)
    1. Pre-reqs: CMSC 150 and CMSC 350 (or 230)
As you can see, all of these pre-requisite courses had their own set of pre-reqs, such that there was a logical order in which to take them. Among the pre-req pre-reqs [sic] were CMIS 141: Introductory Programming and CMIS 242: Intermediate Programming, which I labeled as "Java proficiency" after getting permission from the head of the Computer Science department to test out of them. Therefore my actual undergrad work began in the summer, when I squeezed in approximately 44 hours of learning Java (during my IT cert phase) through resources on my <Free Comp Sci Resources> post, including Codecademy, Sololearn, and creating a program with my brother (a Software Engineer himself) that incorporated all learning materials from the CMIS 141 syllabus. I later tested out of intermediate Java using the CMIS 242 syllabus, though that could have gone a bit smoother (see below). Between August 22nd, 2016 and May 7th, 2017 I spent $8,073 in tuition (+$50 application fee) and god knows how many hours on STUDYING (bleh) math and computer science. The MOST REWARDING courses were those I bolded above. You may be wondering why I didn't just get another degree. Great question, young padawan! In fact, the CS minor at UMUC can be obtained by taking the aforementioned CMIS 141 and CMIS 242 (I tested out of both) and 9 credits at the 300-level (count 'em)... but is only possible if I were to go back for another Bachelor's. Yeah, um, in that case I'll just leave "Minor Equivalent in Computer Science" on my resume. #kthxbye

After 8 courses over 32 weeks, my overall impression of these undergrad pre-requisites could be summed up as, "online courses for the motivated self-learner, but lacking quality control in teaching and student interaction." The turn-key structure was such that all sections of a given course, regardless of semester or instructor, were prepared with the exact same syllabus. This would be fine, except that it felt like you had a substitute professor for the entire semester who was either hands-on and extremely helpful to students, or hands-off and raised more questions on the material than they answered. My regrets were two-fold: 1. Keep schedule expectations low. 2. Properly prepare for courses. For the latter, I'm honestly not sure I could have fit more time into my schedule (see the former), so if anything I should have started even earlier and either just taken those two Java courses or read Head First Java (it's gud). I guess I can't stress too much. In the end, I did Ace all 8 courses and got into graduate school.

Step 5: Pull the Trigger! ("Goal 1: I will prepare for a Master's program in Computer Science")

Just 287 days following the start of my experiment, on Sunday, March 12th, 2017 I applied to MCS programs at Towson UniversityJohns Hopkins University (JHU), and Georgia Institute of Technology (GT). At last, the first major goal for the Dream I had declared and fought for had come to pass, a goal that intended to even the playing field between myself and other prospective applications who already had experience and education in Computer Science! In the post above, I laid it all on the line by sharing the exact statement of purpose that I wrote for GT.

Somehow this entire crazy plan actually worked: I was accepted into all three programs. They really loved me! :D I found myself in a position inconceivable one year ago of having to choose which school to accept. As Towson was more of a safety school, the choice was down to JHU with their highly-recognized (and highly-priced) institution that offers a large variety of in-person and online courses, and GT with their unbeatable tuition cost of ~$7,000 total and the latest in online course technology. This was not an easy decision, but in the end I chose to attend Georgia Tech's Online Master of Science in Computer Science (OMSCS) program for their affordable price tag and #9 ranking in the U.S.

Step 6: To Exponential Growth and Beyond!

Since my last post, I not only began my first OMSCS course (Software Development Process, #amazeballs) but I started working as a Software Engineer with a buddy of mine (as promised, 456 days after I set forth on my journey). It's just part-time for now on top of my full-time IT job, and has already started paying dividends by offering the opportunity to learn a second programming language, Python. I may be bringing in twice as much income for my family [JASMIN] now than before I started my IT job earlier this year, but the important point is I'm having fun learning an infinite collection of new things. Oh, and between you and me, they're also reimbursing my affordable tuition. ;)

And that's all there is to it! Easy, right? Honestly it hasn't always been, but it's the plan that fit me and my circumstances best at the time. Some friends have been very successful with bootcamps or the traditional B.S. (Bachelor of Science, what did you think I meant?!). Even though I'm nowhere near the level of High Wizard yet (more Goals to come soon!), I've seen enough to know that if you're considering setting forth on a new Dream you should be ready to carve your own path. As Bruce Lee once said, "Adapt what is useful, reject what is useless, and add what is specifically your own."