Starting software projects: Tools

At this time, when we have the idea, some requirements and maybe some designs about our application is time to think what tools, frameworks, languages, IDEs, etc, we are going to uso to develop the entire solution. It’s important to take some time to analyze what the market provides us.

Well, let’s think about what we are going to develop:

  • a mobile application,
  • a web application to provide some information about our development,
  • we should have a server to deploy backend application to exchange information between our mobile app and our stored data, and
  • we should have stored data in a database.

Therefore, now that we know what to develop, it’s time to choose tools, languages, frameworks, etc. Let’s start by the easiest: mobile application.

What should we think about when we want to develop a mobile app?

  • Language: In this case, we are going to develop an Android application, son the base language will be Java version 8 or higher.
  • Development environment or IDE: Android Studio since Eclipse will not be supported any longer.
  • What else? There are some implicit tools when we use Android Studio, for example Gradle. It’s a build system that include, among others, features such as dependency management, logging, reporting, build our application, etc. Android studio includes ProGuard, an optimizer for Java bytecode that allow us obfuscate our Android code.
  • What about third parties? Great, should we use a third party library? Why not, if it exists, just use it. It’s important for a developer don’t waste time reprogramming existent code, unless you can’t afford the license price. Most common third party libraries are:
    • Retrofit: It is a REST client for Android which maps an API into a client interface using annotations.
    • Picasso: A powerful image downloading and caching library for Android.
    • Glide: An image loading and caching library for Android focused on smooth scrolling.
    • Dagger: A fast dependency injector for Android and Java.
    • EventBusEventBus is an open-source library for Android using the publisher/subscriber pattern for loose coupling.
    • Parceler: It is a code generation library that generates the Android Parcelable boilerplate source code.
    • ButterKnife: Annotate fields with @BindView and a view ID for Butter Knife to find and automatically cast the corresponding view in your layout.
    • IcePick: Icepick is an Android library that eliminates the boilerplate of saving and restoring instance state.
    • RxJavaRxAndroid: Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.
    • ACRA: Application Crash Reports for Android.
    • SQLite: SQLite is an in-process library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine.

Don’t worry if you don’t know any of those libraries, I will explain them as I use them. Next step, we are going to develop a web application so, what kind of tools, frameworks, languages should we choose? It depends on the people you ask, your needs, your client, your budget… You can never learn too much so, why not to try something different? I’m going to choose for you therefore you don’t have to care about it. These are the chosen ones:

  • Frontend: we are going to develop an AngularJS solution. Again, we are going to use this tools implicitly:
    • NodeJS: Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js’ package ecosystem, npm, is the largest ecosystem of open source libraries in the world.
    • AngularJS: There are two versions right now (v1.x and v2.x). They are completely different, so you should learn one or other, or both. HTML is great for declaring static documents, but it falters when we try to use it for declaring dynamic views in web-applications. AngularJS lets you extend HTML vocabulary for your application. The resulting environment is extraordinarily expressive, readable, and quick to develop.
    • TypeScript: it is a typed superset of JavaScript that compiles to plain JavaScript.
    • Gulp: it is a toolkit for automating painful or time-consuming tasks in your development workflow, so you can stop messing around and build something.
    • SCSS: Sass is the most mature, stable, and powerful professional grade CSS extension language in the world.
    • Angular Material: For developers using AngularJS, Angular Material is both a UI Component framework and a reference implementation of Google’s Material Design Specification. This project provides a set of reusable, well-tested, and accessible UI components based on Material Design.
    • Yeoman: Yeoman helps you to kickstart new projects, prescribing best practices and tools to help you stay productive.
    • Jasmine: Jasmine is a behavior-driven development framework for testing JavaScript code. It does not depend on any other JavaScript frameworks. It does not require a DOM. And it has a clean, obvious syntax so that you can easily write tests.
    • Karma: The main goal for Karma is to bring a productive testing environment to developers. The environment being one where they don’t have to set up loads of configurations, but rather a place where developers can just write the code and get instant feedback from their tests. Because getting quick feedback is what makes you productive and creative.
    • Protractor: Protractor is an end-to-end test framework for Angular and AngularJS applications. Protractor runs tests against your application running in a real browser, interacting with it as a user would.
    • And HTML 5, of course.
  • Backend: we are going to opt for a JavaScript-based backend instead of using a Java-based backend. Thus, we are going to build our server using this tools:
    • NodeJS.
    • Express: A fast, un-opinionated, minimalist web framework for Node.js applications. In general, “Express” is preferred to “Express.js,” though the latter is acceptable.
  • Database: I have decided to separate database from backend because if we think about the architecture of this kind of solutions, databases are generally separated of other elements such as the presentation layer or the backend layoer. By the way, we are going to use MondoDB.
    • MongoDB:  MongoDB stores data using a flexible document data model that is similar to JSON. Documents contain one or more fields, including arrays, binary data and sub-documents. Fields can vary from document to document. This flexibility allows development teams to evolve the data model rapidly as their application requirements change. When you need to lock down your data model, optional document validation enforces the rules you choose.
  • IDE: I love WebStorm to develop web apps, but you need a license to work with. You can use Eclipse with a lot of plugins to develop the web app, but I’m going to use Visual Code, a free editor that allows us install different plugins to work with our frameworks easily.

Other tools we need to keep in mind are a source control, Git or Subversion are the most extended, but I’m going to use Git. I will share my code through GitHub.

Sometimes it is not as simpler as it looks to choose the right tools or frameworks and therefore we should firstly analyze all our needs about the project searching information on the Internet. There are other JavaScript frameworks to build the frontend, i.e., ReactJS, Ionic, etc. Another task manager , like Gulp, is Grunt. We can use LESS or simple CSS to provide styles to our web app. Besides, there are several Java-based frameworks to build the backend, such us Spring Framework. But I think that the chosen ones are more common to work with.

Once again, don’t panic! I have talk about many tools and frameworks, but soon I will tell you a trick to start faster than it looks. Meanwhile, you can take a look to the links provided in this post to know more about the tools and frameworks.

Leave a comment