The Software Engineering Portfolio for Nathan Karasch

Reflecting on My ISU Experience

First, a Word of Thanks

I have been tremendously blessed to have been able to attend college in pursuit of my dreams; and not once, but twice! Consider these various facts, and see if any of it makes sense. During my time at Iowa State…

  1. My wife and I had 2 kids within 14 months of each other.
  2. We bought a house.
  3. I founded and (briefly) ran a club on campus.
  4. Ashlee and I started a small business from scratch.
  5. Aside from paid summer internships, I didn’t really have to work during my time at school.

Wait… what? How is that possible!? Our friends and family would often look at our situation and think, “How are they paying for all of this?” Like I said, we have been tremendously blessed. God has had his loving hand over our lives and has provided in every way imaginable.

The GI Bill benefits from serving in the Marine Corps were a large part of that blessing, so thank you everyone for paying your taxes and supporting our armed forces! I used to laugh at those who joined the military just for the college benefits, but now that I’ve been at the receiving end of those benefits, I can honestly say that they are well worth enlisting for! Of course, it probably shouldn’t be your primary reason for enlisting, but… well, I’ll just leave it at that.

Scholarships and grants from the government, from ISU, and from generous donors also played a big part in funding my education and my family’s well-being. God blessed me with the ability to do well in school, and it didn’t take long before I saw a direct correlation between grades and funding. This brought the realization that doing well in my classes was more important than holding a part-time job. Thus, the decision to refrain from work was made. By focusing my time entirely to my studies (as well as family), I could be a better provider financially to my family in the short term, with scholarships, and in the long term, with better job placement upon graduation.

Last, but not least, I need to thank my family and friends for their emotional, financial, and spiritual support through everything. My and my wife’s parents have been tremendously supportive, and their gifts also played a large part in providing for our family these past four years. Within our first year (singular) in Ames, Ashlee and I moved three times (good grief!), and there was always a crowd of friends and family willing to help us do what nobody likes to help do! The prayers, emotional support, and encouragement also helped us say afloat during rough patches and difficult times. So thank you everyone! You made us feel wonderfully loved!

I wanted to start this reflection on a note of thanks, because it really is by God’s grace that we made it to where we are today. Any glance back over such a tumultuous time of growth requires you to take stock of what you have to be thankful for. If we lose sight of that, we lose a little bit of what it means to be human. Knowing that your success is not your own is humbling, and it allows you to show compassion and grace to those who are less fortunate than you.

Preparing Professionals

The goal of any engineering program is to train and equip students to become professionals. Professional problem solvers in a given domain. We’re trained in the entire life cycle of project development, from conception to completion, and we’re given enough hands-on experience to solidify conceptual understanding and to develop good habits, reliable instincts, and a systematic approach.

As with many learning experiences in life, you get out of it what you put into it. Students in the Software Engineering program get the chance to do project work and put their skills into practice every semester. Some students choose to do the bare minimum, and I imagine they don’t get as deep an understanding of their field as those that choose the hard problems, take chances, and stretch themselves.

This hands-on project work is where we get to take the classroom experience and apply it to a real system. In that respect, I feel that Iowa State does a good job at preparing students to design systems and processes. Here’s a quick rundown of some of the various project experience I’ve had over the past four years:

Project and Lab Experience

ME 170 1
Used Solidworks to create multi-view drawings and models for a reverse engineered coffee maker, a shop table clamp, and a custom robotic drink mixer.
Com S 227
Various programming assignments in Java.
Cpr E 281
Labs involving programming arithmetic circuits and finite state machines in Verilog.
Com S 228
Various data structure implementation programming assignments in Java.
Com S 309
Semester-long project of our choosing. My team made a pretty good attempt at creating a social media website.
Com S 327
Semester-long project in C/C++, where we created a Roguelike game. At the end of the semester, we implemented a short project of our choosing. I created a command line application to query the NextBus API for CyRide routes, stops, and schedules.
Com S 363
Various labs designing and working with relational databases.
Com S 319
Various labs dealing with different languages and frameworks. We also created four portfolio projects of our choosing, all of which are discussed on the Projects page.
Com S 321
Various labs dealing with computer architecture and machine-level programming (assembly).
SE 329
Designed and created four projects of our choosing. We created facial recognition system, a distributed computing system, a MIDI visualization and playback website, and a game-playing AI.
SE 339
Designed and created an Internet of Things management website built on a microservice architecture.
Com S 311
Various programming assignments dealing with computer algorithms (for example, implementing a web crawler).
Com S 352
Various programming assignments dealing with operating system design (for example, implementing a shell application).
Com S 342
Various programming assignments dealing with programming language design.
Com S 417
Various programming assignments dealing with software testing.
Com S 435
Various programming assignments dealing with algorithms for large data sets (for example, computing similarity among documents).
SE 491
Part 1 of a two-semester long senior design project.
SE 494
This portfolio website!

All of these experiences forced us to make thoughtful design decisions and formulate solutions to engineering problems. Of course, we weren’t just thrown these problems and expected to sink or swim on our own. The material taught in the classes prepared us, giving us the tools needed to tackle each new problem.

Some of the harder things for a university to teach in an engineering program are global/societal issues and ethical implications. At ISU, and I imagine at most universities, these things are given a brief shout-out in several of the classes, but they’re not covered in any great detail. Since the course load is full enough as it is, I can’t imagine where they would fit some required class that discussed these in depth. However, I will say that the multi-cultural nature of universities, the international perspective and US diversity requirements, and the obligatory discussions in some of the professionalism classes do well enough to prepare students with at least a basic understanding of global, societal, and ethical engineering issues.

Team Work and Interpersonal Communication

I mentioned that we do lots of hands-on experience in the Software Engineering program, but it’s also important to note that many of those projects are done in teams (often groups of four). This helps students to develop their communication, project management, and collaboration skills. Working in groups forces you to encounter issues outside the domain of technical engineering problems. What do you do when a fellow team member isn’t pulling his weight? How do you react when the team wants to take a shortcut instead of delivering quality work? How do you communicate your views, opinions, and arguments tactfully and persuasively, without antagonizing the other team members? Working as a team also helps give fresh perspective on problems that you would not have thought of otherwise.

Learning to Learn Quickly

I saw a great programming humor t-shirt that read as follows:

WHAT I SAY: I’m a software develo-

WHAT PEOPLE HEAR: I can repair your computer, fix your internet, configure your printer, revive your phone, set up your email, build a billion-dollar app, and hack into any system. All for free. I am the IT god.

WHAT I MEAN: I can Google better than the average bear.

Joking aside, it’s true that we do a lot of Googling as programmers! And not just from lack of experience or forgetfulness. Choosing a career in software development means keeping pace with the times, and technology changes at a ridiculously fast rate. The framework of today is a dinosaur in only a few short years. At Iowa State, I’ve worked in Java, JavaScript, C, C++, Python, Php, Dart, HTML, CSS, MySQL, Perl, Angular, Angular2, ANTLR, Verilog, Matlab, Solidworks, Bash, Assembly, Java Spring, and on and on and on. Languages, libraries, frameworks, development tools, IDEs, operating systems, and all the other technologies that you deal with are just a part of life as a developer. You have to become good at learning, and learning quickly! And of all the different technologies I’ve learned in the past four years, only a small handful of them were actually formally taught in a class. Most of the learning is on your own time. Self taught and on the job, so to speak.

Here’s an example: For our senior design project, we chose a project that would need to be implemented in Node.js. Though I had used JavaScript before, I had never worked on a Node project. In addition to learning the ins and outs of the language, it required extensive research into each dependency we chose to use. For example, we needed an HTTP client module to make requests to various REST endpoints. For Node, there’s several popular ones to choose from: Axios, Got, Request, Reqwest, and Superagent, to name a few. Each decision of this type forced us to evaluate different options, choose the best one, and then learn the usage and syntax for that given dependency. The moral of the story: in the world of software development, you’re never done learning!

Some learning pursuits that happen outside of coursework have nothing to do with your studies. Sometimes it’s just to satisfy an itch. To explore something new and exciting that intrigues you. Hackathons (e.g. HackISU) are great outlets for creativity and learning new things. I attended four of these during the first couple years at ISU. One thing I’m looking forward to doing during the upcoming Christmas break is taking an online course at covering penetration testing. It’s not something that was taught in any of my courses, but it’s something that fascinates me!

Finishing My Degree

At the time of writing this post, I am two weeks away from finishing my second-to-last semester at Iowa State. I think there is very little I would change about my experience. Even the class I dropped taught me life lessons that I wouldn’t have gotten otherwise. With projects, however, whenever I look back at old projects I have the tendency to say, “Ah! If only I knew then what I know now, what a difference that would have made! I could have made it so much better!” But I guess that in itself is evidence of growth. Being able to look back at your work with pride but without ever being fully satisfied… that means that you are continuing on an upward trajectory towards better mastery of your craft. ■

  1. I began as a Mechanical Engineering major and switched to Software Engineering after my first year.