Here in The7bits we are developing custom software solutions for a wide range of clients. Modern software development is not a simple process. We should follow a lot of practices and processes for a good and reliable result. A complexity of modern software products is increasing dramatically for the last decade. It means that role of customer education is also increased. What do I mean when say “customer education”? I am talking about a complex of activities like meetings with clients, preparing information about different challenges in software development etc.
Let me give an example. Today we are the eyewitnesses of a big change in the global economy. Many traditional offline sectors of the economy are changing dramatically. Just look on Uber or AirBnb. And now we see like many non-technical entrepreneurs with expertise and experience in different real sectors of economy tries to start their own businesses with a help of modern technologies. If you will go to AngelList you will see a lot of startups like that. In logistics, delivery, medicine, transportation, agriculture, food and other sectors. We are also a part of that world, the last year we are working on Crane-Locator startup and tries to change a sector of project cargos. I think that it is a fantastic experience for us. The huge opportunity of modern days is a possibility for non-technical entrepreneurs to create a simple prototype of their products almost without coding with a very minimal volume of technical knowledge. Services like Squarespace or Shopify could help to create a simple “zero version” product very easy and fast. But very often an idea of a startup requires a custom software development. And price of making a wrong decision is very high for a young startup with (as it often is) a limited funding. In such situation an entrepreneur has few options:
- Hire a developer or few developers on services like UpWork on a per-hour basis.
- Hire a developer or a team of developers for full-time work.
- Outsource a whole development process to the agency.
- Outsource a dedicated development team to the company which provides such kind of services.
Each of these options has pros and cons. But let me give an advice. Do not think about a team of developers first. Think about technical management. The best situation is when one of the co-founders of a startup could play a role of Chief Technology Officer (CTO). It is a guy who make decisions about project technology stack, development processes (who, what, how and why should do), a set of necessary team roles, development strategy, release schedule and bunch of other things. For technology startups, it is a key role because it almost impossible to build a good and reliable product without such guy. If entrepreneur does not have a co-founder like that he or she has two options:
- Hire CTO. Or find yet another co-founder on this role.
- Outsource CTO role for a some period of time to the agency.
The first option is not an easy. Hiring such kind of person is a really very hard process. Because life or death of a startup depends on the person you will hire. In general, the best choice in such situation is choosing the second option. Outsourcing a whole product development process including a technical management role is a good choice for developing the first version of product or MVP (Minimum Viable Product). If your project will be successful you will able to build a full-time dedicated development team for your project for increasing a reliability of your business later.
But why a technical management is so important? Some people (and I really saw people like that) think that software development is a very simple process. Just find a developer and ask him or her to write an application which does something. Typical idea looks like that:
It is a real photo of our whiteboard in the office. Believe me that if you will take an average developer and ask him to implement this idea without some involving in the process the result will be not very good. And here I am talking not only about the result on the screen of the developer’s laptop. The next list of questions are very important:
- Where to store project’s source codes?
- Who has an access to source codes?
- How to follow changes in source codes?
- How to organize a work with source codes
- What to do if we found a critical bug when a developer is working on a big feature and cannot implement a fix without breaking a whole product?
- How often to update source codes on the remote storage?
- How to launch a project for public?
- Where to host a project? Will we use dedicated or virtual servers or cloud platform (like Heroku)?
- If we use dedicated or virtual server who will administrate the server?
- What the strategy for scalability? Do we need a horizontal scalability (when an application can scale to many servers) or vertical scalability (when we can scale computational resources with fixed amount of servers) is enough for us?
- How to deploy source codes to a production server (or servers)?
- Do we require a staging server?
- Do we require automatic tests?
- Where will automatic tests run?
- Do we need a continuous integration?
- And many other questions about monitoring of server resources, web app monitoring, errors tracking, debugging services etc.
Really, a complete list of such questions could be very large. And if you need a developer, not for the development of some very simple script or doing a little experiment you should know answers for each of these questions. If you do not have an answer on few of such questions you must understand a risk. And here you should understand that if you found a developer for a per-hour basis on the service like UpWork the answers for such questions is your competence, it is not developer’s competence.
Let us explain a software developer process in details a bit. First of all, we should make some decisions about project’s infrastructure. It is an extremely important thing because web project must be accessible online. And it is much more important for lean development practices. Because we should update public version continuously for getting feedback for modifying the product. And this is a cyclic process. It means that infrastructure is a necessary part of the development process.
The infrastructure should provide a solution for the next problems:
- Production environment
- Staging environment
- Server orchestration
- Error collection
- Server monitoring
- Application monitoring
- Version control and source code storage
- Continuous integration (automated tests running, reporting and deployment)
Each project requires its own infrastructure due the available budget and project features. The next picture was made during one of our brainstorms where we planned a start of a new project.
In this particular case, our customer had a very limited budget and we built an infrastructure by following a lean startup methodology. The result was like that:
- Bitbucket for version control (Git) and storing the source codes because it has good prices for work with private repositories and has enough functionality.
- DigitalOcean as a hosting provider.
- Self-hosted open source version of Sentry for collecting the application errors.
- Our own custom developed server orchestration platform Grape which provides special web-based tool for operate the Docker containers.
- Pingdom for check the application health and load time.
- NewRelic for server and application monitoring.
- DroneIO as continuous integration service for running automated tests and deployment.
- Mailgun as a mail delivery service.
- Amazon S3 as a storage for daily incremental backups.
Such kinds of decision are very important because now we have a construction site for our project. Of course, different starting conditions produce different decisions. And you need a high-class specialist for that. The next piece of decisions is a list of rules and standards which every developer in the team must follow. There are two pieces:
- Internal standards of coding and deployment.
The first decision which should be made is a list of accepted technologies. For example:
- Python 3.5 as a programming language.
- Django 1.9 as a web framework.
- Ubuntu Linux Server 14.04 as server operation system.
- PostgreSQL 9.4 as database.
- Redis as key-value storage.
- Memcached as a distributed cache system.
The list could be increased later during the process of development but each item should be accepted by a lead developer or CTO because technology stack must be stable and maintainable, there is no place for surprises.
The second piece of development rules is internal standards. For example:
- Each line of code must follow PEP-8 rules.
- Branch with a name “master” contains a stable version of a project. The source codes of a version which are currently in development must be in “develop” branch. Each experiment or feature implementation must previously be stored in separated branches.
- Each commit must be reviewed by another developer from the team.
- Each new feature must be covered by automated tests.
- And so on…
It is a very limited list, just for example. But the availability of such rules is also a very critical part of the development process.
Why are infrastructure and rules so important? Because it is a skeleton of the future engineering department of your business. It is a canvas which allows to hire required specialists and grow your team. If you do not have rules you will have a chaos. The sad truth is that there are much more people who can code than people who can write rules and build a team. Such kind of job is a technical management.
As you see the software development is a complex process which includes different kinds of activity. Anyway, it shouldn’t stop you on the way of implementing your business ideas. Do not fear to work on your startups and everything will be good. The main advice which we would give you is doing the right things right.Oleh Korkh