Software Development An overview of careers in Business Application Development http://goo.gl/3go6re Sources: Dice.com, money.CNN.com, InfoWorld.com, money.USNews.com, GlassDoor.com, Indeed.com, OODesign.com, LosTechies.com, myself
The Job Market Or… “How to win at life”
Jobs… jobs EVERYWHERE! 120% growth over the last 4 years Estimated 30% growth through 2020 Jobs in every city Demand for developers far exceeds supply
Who likes money? Average salary of $92,000+ Salary starts lower, but scales quickly with experience. Some of the highest disposable income is in Texas!
The most fun you can have at a desk (legally). Flexible hours Casual dress code Fun environments Beer and ping pong!
What is Software Development? No, really…
Consulting vs Product vs IT
git merge reality Coding is only half the battle. You must understand the needs of many different clients. Development methodologies are part of the job.
Do you like Waze or Google Maps? Agile (http://agilemanifesto.org/) Waterfall XP SCRUM KANBAN
It’s all fun and games until someone uses REGEX. Complexity comes from modeling the real world in code in a manageable way. Complex algorithms are rarely needed. Business requirements are often mundane.
Let’s just rewrite it… Making WORKING code is easy Making GOOD code is hard Aim for Readability and Maintainability Performance is rarely a concern
Principals of Software Development An overview of the tools we use in Business Application Development http://goo.gl/3go6re
TDD Unit testing aids in bug finding and refactoring. Writing tests first guarantees that code is tested and follows good design. This process normally follows the Red->Green->Refactor workflow.
It’s dangerous to go alone! Take this. DRY SOLID Principals Design Patterns YAGNI Standards/Conventions Automated Testing/TDD Pair Programming
Single Responsibility Principal Each class should do ONE thing and only ONE thing. Classes should be as small as possible. Then make them smaller.
SRP Example class Book class Book class Printer { { { string getTitle()… string getAuthor()… void printCurrentPage()… } class Book { string getTitle()... string getAuthor()... string getCurrentPage() { return currentPage; } } class Printer { void PrintPage(string page) { Console.Print(page); } }
Open-Closed Principal Classes should be open for extension, but closed for modification. If you add functionality, you should be able to add code, not change existing code.
OCP Example class Sql { public Sql(string table)… public void Create()… public void Update()… interface ISql { public Sql(string table)… public void Run()… class SqlCreate : Sql class SqlDelete : Sql
Liskov Substitution Principal Derived types and base types should be compatible. Derived classes should EXTEND base classes, not change them.
LSP Example class Square extends Rectangle { public void setWidth(int width) m_width = width; m_height = width; } public void setHeight(int height) m_width = height; m_height = height; class Rectangle { public int getWidth()… public void setWidth(int width)… public int getHeight()… public void setHeight(int height)… public int getArea()… }
LSP Example continued… public void SetRectangle(Rectangle shape, int width, int height) { shape.setWidth(width); shape.setHeight(height); } // What happens if we pass this function a Square object?
Interface Segregation Principal Interfaces should not be “fat”. If you implement an interface, it should mean that you need the whole thing.
ISP Example interface IWorkable { public void Work(); } interface IWorker { public void Work(); public void Eat(); } class Worker : IWorker class Robot : IWorker interface IWorkable { public void Work(); } interface IFeedable() public void Eat(); class Robot : IWorkable
Dependency Inversion Principal Higher level classes should depend on lower level classes. Classes should depend on abstractions, not concretions.
DIP Example interface IPrinter { void PrintPage(); } class ConsolePrinter : IPrinter { void PrintPage(string page) { Console.Print(page); } } class TreeBurner: IPrinter HPPrinter.Print(page); class BookPrinter { void PrintBook(Book book, IPrinter printer) { var page = book. getCurrentPage() while(page != null) printer.PrintPage(page); page = book. getCurrentPage() } }
Design Patterns http://www.dofactory.com/net/design-patterns Patterns provide solutions for common situations that follow best practices. Patterns are easily recognizable by other developers.
Josh Rizzo Senior Consultant Improving Enterprises Josh.Rizzo@ImprovingEnterprises.com