Professional Documents
Culture Documents
1 CodingVEngineering
1 CodingVEngineering
By this point in your college career you have written a LOT of code – at least as part of programming
assignments.
My first claim to you is that the process you used to build that code is similar, yet fundamentally different
than the process of creating production software.
To kick off this class, we want to catalog and explore these differences. Let’s think about some of the key
properties of a programming assignment:
Programming Assignments:
Are for a grade – based on the syllabus, you can just skip some parts or “optimize” failure.
Have well-defined, abrupt timelines – procrastination has a shelf life of a couple weeks.
Have temporal locality with coding concepts – you have notes and a textbook to reference; techniques can be
inferred from the assignment’s learning objectives
Have a low ceiling on negative impacts to your life – if you fail a class, you can take it again.
Are often short and intended to be completed by a single developer – sociological issues are minimized; so what if
you have a disagreement with yourself?
Coding
Nowhere in this action is the intent implied – you could be coding for educational purposes or for work or
just for the fun of it.
To be a bit pedantic, software engineers do produce code, but there is a lot more to it than just opening a text
editor or IDE and typing on a keyboard.
Software Engineering
Software engineering is the process of creating a tangible, concrete solution to a problem – with software.
If you think about it, even if you weren’t interested in computer science it would still affect almost every
area of your life.
Today we have technology that wakes us up, takes us to work, facilitates us doing our jobs, brings us food,
takes us home from work, and helps us fall asleep.
Much of the history of technology (and software engineering) is predicated on a simple idea: shifting
complexity
Software is Complicated
Prior to technology capable of removing tedium, humans inherently lived with a lot of complexity.
Think about producing financial reports without a database or even Excel – it’s not pretty.
Much of the role of technology is absorbing this complexity from the human condition.
Rather than you keeping immaculate records in a paper-based ledger, Excel or SQL does the heavy lifting for you –
and you freely give up that complexity.
Because of the complexity we have shifted from humans to technology, software is also often very large.
Microsoft Windows ~50 million lines of code
Microsoft Office \ Linux (most distros) ~30 million lines of code
Webkit Browser ~140,000 lines of code
Google Chrome ~1.7 million lines of code
Chevy Volt ~ 10 million lines of code
Clearly these are projects that are logistically too large for a single engineer to create, much less maintain.
Software is Big
Let’s say that you are a “rock star” of a developer and you can generate 10,000 lines of pristine code a day.
:O that’s a lot of code…
To build the system for even a simplistic electric car would take almost three years with no time for
debugging, testing, design modifications, etc.
So, the obvious fix is to bring in more developers – software engineering is a team sport
Software is Built by Teams
While programming assignments are often solo – production software often isn’t.
The soft skills required of a good software engineer are vital and EXTREMELY non-trivial.
Skills like communication, time management, effort estimation, and civility are often quickly overlooked in
lieu of raw technical prowess
If you are the best programmer on the team, but everyone thinks you are a jerk, you are not the best engineer on the
team.
Communication and Teamwork
Many times, unknown aspects of someone else’s life negatively impact their ability to focus, which
negatively impacts their ability to perform their job.
While a programming assignment might take several weeks to complete, eventually you complete it and
either take the loss or celebrate the win.
Software that is released today might still be in use 30 years from now – many banking and business systems
still run on COBOL.
You can’t simply release a piece of software that is 60% complete and hope for the best – no one will buy it
and your company will fail.
Conclusion
You might be a fantastic programmer with deep knowledge and years of experience with C++ or some other
language.
Being a great programmer does not imply that you are a great software engineer.
To be a great engineer requires soft skills like communication as well as deeply technical skills like
architectural design.
The purpose of this class is to provide the knowledge and skills to help you bridge the gap from being a
successful programmer to being a successful software engineer.