Friday, August 12, 2016

Software architecture. Connecting people

"Nokia, connecting people"
May seem unknown for millennials, but that was a slogan of my first mobile phone company. :)

Communication is vital for every project even for small one. Actually, weak communication is one of a major reasons of project failure, especially when we talk about outsourcing development.

Project's stakeholders have a different vision and concerns about the project, and in most cases, their requirements can not satisfy them all in same time.

Surprisingly, end user is also stakeholder in project. Yes, he also has a requirements to be heard and considered. And the hardest part to build product for people not for a dev team resume.

Software architect's duty is to make balance between stakeholder requirements.

The communication inside of team or company not always helps: despite of specs, clear development process and daily stand-up meetings, development teams maybe still isolated from real users and management strategy. Many aspects are unknown and can not be measured on early stages of planning or development stage, that's why architect's experience so necessary.

Usually management are not IT people, they do not (and shouldn't) understand project's technical details, but they can easily understand System View Diagram or HLD document. Software architecture is common abstract language all project's players can speak.

Tuesday, June 28, 2016

Is there "Good" Software Architecture?

I hear developers saying "when I joined the company, there was bad software architecture". I was also thinking like this. But the fact is there is no "good" or "bad" software architecture, the thing that matters if architecture actually fits the requirements.

The software architecture is set of software structures and relation between them. Not only a metaphor to the construction architecture, it has many common ideas. For example, fundamental parts should be considered from the beginning. You can not build skyscraper on foundation of private house. Same for software architecture, you cannot run complex, high-availability, scalable project on architecture not fulfilling those requirements.


System requirements form a list of software architecture quality attributes. Here few examples of common quality attributes for modern software:

  • Modifiable - the system can be easily updated. Easily in terms of time/cost for implementation a new feature. 
  • High availability- the system should operate in case of high load and failures.
  • Scalability - the model of splitting responsibilities between system components.
  • Performance - the focus is on system response time.

Of course, this is not a complete list since each system will have its own individual requirements. 

It may seem easy to modify software architecture, however it can be really painfully and costly. That why so important to create it maximum thought-out at fundamentals. 


On this picture you can see the Rossi steet in Saint-Petersburg, named for its architect Carlo Rossi. This street is unique because it follows the canons of classical antiquity: its height and width are identical (22 metres (72 ft)), and its length (220 metres (720 ft)) is exactly ten times its width.

Monday, June 27, 2016

2016 Web Performance Optimization Tips And Best Practices


You must admit, we all love fast web apps, not less than users of our products do. The focus on web performance became a mainstream with permanent increase of average page size and Mobile Internet usage. The average page weight 2.2MB can be fast loaded to broadband connected user, but for mobile devices using 3G network it can take a while. Your users will never complain about heavy loaded pages and will not wait, they just abandon them.

As Web Developers we need to make sure our web app is working as fast as it possible. If you take modern web site, you will find many fonts, plugins and external scripts integrated. More features we add to our product more bits we need to send to user's browser, which makes the process of optimization kind of permanent. I don't know how about you, but for me it is interesting task.


Back-End optimization

The Rule of thumb is "The optimization starts from measurement". To find out your bottle necks you must measure execution time of your system methods. Problematic places to look for are: SQL queries, external API call and complex requests. There are plenty of profiling and monitoring tools, which allows you to measure every corner of your project. You don't have to measure everything, but after all, only you know what exactly to measure :)

"It is working fast on my computer", I can imagine, this sentence is familiar for you. That's exactly the reason why its so important to profile and monitor production system as well. More data, cloud environment and virtualization can affect your project performance.

Good idea would be simulate load on your system to see its behavior with concurrent requests.

Back-End optimization might include:
  • Caching   
  • Measuring execution time and method optimization 
  • Fast Host

Caching

It does not matter what technology stack you are using in project, there is a lot of data that must be cached. There are many techniques and approaches for caching, however the decision what to cache and for how long its completely individual. I do believe at least 90% of project's data can be cached. Just imagine how you can improve performance by caching for few seconds high loaded server response. 

On large scale systems the best practice would be to implement distributed cache. However not all data should be shared between instances, there could be latency while connecting cache server especially in peak hours.     

Measuring execution time and method optimization

If you are strict to S.O.L.I.D principles at your work, it would be easy to measure and optimize problematic code. That is one reason to follow these principles, by the way. Otherwise, you have a long way ahead of splitting responsibilities and simplifying your methods. Producing simple, maintainable and testable code from very beginning, will make your life happier in future.

Complex database queries and wrong data structure usage can slow down the system. Measure heavy methods execution time. It is very important to measure on production and in peek period. That can give you a clear picture about your system behavior under real load. 

Fast Host

Budget constrains and as the result provider quality can become a problem for your project. Here are some tips for choosing:

  • Don't trust advertisement, measure.
  • Pick a host according to location of site's target audience.
  • Benchmark it on peek hours.
  • Read user's review before.
  • Ask about customer support.
I emphasized the last because of in case of outage you might have noone to talk with, which is depressing.  


Web optimization

Finding out font-end related performance problems is easy, you can use Google's PageSpeed Insights or other similar tool. For better understanding the performance on mobile devices you can simulate mobile networks speed.

Here are some highlights for optimization:   
  • Use CDN
  • Minimizing
  • Implement compression
  • Optimizing images
  • Css delivery
  • HTTP caching:
  • Mobile version of website


Use CDN

The CDN is not new, however not all web sites are using it. The major reason for usage of CDN for static content images, css, javascript file and so forth, is reducing latency. The principle of picking content from closest to your location server, can be very helpful especially for international websites.
If you still not using it, it's high time to start.


Minimizing

Removing white spaces and comments from your files can save you 20-30%. Avoid loading not required (not shown) html objects like dialog, modals, images and etc, bring it on demand with ajax call or "lazy load" technique..

For mobile users recommended to have dedicated mobile web site, squeezed version of main web site.

Bundler & Minifier extension for Visual Studio

YUI Compressor command line minifying tool


Implementing compression

Well, that's pretty obvious. The less size of file faster it being transferred. Dynamic pages are being dynamically compressed, which comes at the expense of page rendering speed.    


Image optimization

Images are significant part of page size as result you can save a lot bytes transferred by proper optimization. The process of optimizing image delivery might include:
  • Choosing right image format - according to your functional requirements. 
  • Display scale images - image should have a size and delivered according to it. For example: if you have a thumbnail for each image you can prepare a resized copy of it, or you can resize it "on the fly".  
  • Lazy load - with that technique only show to user images will be served. Good solution for pages with a lot of images.
  • Remove image metadata - some images can include geo location and camera info and so forth. You can remove it with proper tool


Css Delivery

Css delivery optimization is similar to "Lazy load" principle, that delivers styles and scripts needed for showing only a visible content. preventing render blocking css. Rest content is downloaded afterwords or downloaded on demand. For more information about it please refer to Google's guidelines.  


Http Caching

This mechanism allows you to control what content and for how long to keep in user's browser cache.
Each time browser about to get file from the server it checks whether it already have up to date copy of it. Less files downloaded is better. Here is Google Developer's guidelines about this topic.


Mobile version of website

Having dedicated mobile version of your web application, of course will be best solution for slow network users, however it will take extra cost to develop and maintain it. Development of mobile version   





Photo taken from www.freegreatpicture.net

Monday, June 20, 2016

A few words about Microsoft LinkedIn deal

"Who owns the information, he owns the world"
Rothschild

Although, this phrase was said 200 hundred years ago, it doesn't lose its actuality.

I've heard many positive and skeptical opinions about the Microsoft and LinkiedIn deal. I would say ratio is 50/50. The skeptics call this deal another Microsoft failure and I can not agree with it. See the history of last few years acquisitions, the giants buying information sources. Skype, Instagram, Whatsup they are all about huge personal data source. Now its corporate and business info turn. Who is taking control on this kind of data is a winner.

LinkedIn stores huge amount of data about companies, employees, freelancers and job postings. But the real "gem" is business relations information. Owning such information, with little effort and AI help, you can identify the clients, suppliers, partners and so on. This is priceless information if you know how to use it. For example you can simply market it. Microsoft have always being champions in marketing.

I can not think about any advantage for LinkedIn users at the moment, except of integration in Office suite. Will see in next couple of years, what direction does it move.

Thursday, June 16, 2016

Want to study web development? That is how your profile should look like in 2016

"Web programming in two weeks", "Become a web developer in 3 month". How many times a day you see similar ads on tech related web sites? The answer is: too many. Web development and software no longer a profession, it has become a product that can be easily sold on market.

In real world to become a good developer you need to invest 10 years of your life. Years of hardcore work, learning and learning. Actually for developer learning is never ending process. You will need to keep your self updated with last technology trends. You can easily become outdated, because you are not familiar with new technology or methodology.

Algorithmic and analytical thinking, problem solving skill they are only the tip of the iceberg in ocean of knowhows and skills you will have to gain.

I prepared average skill list for mid level+ web developer. The details can vary, however you can realize the amount of knowledge it takes.  

Front-End

"Do you know HTML?" That's weird question recruiters love to ask. But the reality is tough: to be web developer nowadays you must have experience at:
  • HTML5+CSS - comprising not only markup tags, but also new features. You must be aware, as well, what features are supported or not supported by current browsers. Of course you should be able to find workaround if needed. Cross browser support will need a lot of workarounds, be prepared.
  • Responsiveness - more than half (number is growing) of web visitors coming from mobile devices. 
  • JavaScript - I remember time then JavaScript was used for creating rollover buttons. That was a good time. Nowadays, 70% of development related to JavaScript. On projects grow many line of code added, its should be maintained and tested. 
  • "Frameworks fest" -  handling tons of js code and solving common problems no that trivial anymore. Usage of frameworks significantly helps to make your life easier, however you must know how they work and most important how do they interact with each other. 
  • API's - REST will make you restless. You will have to know HTTP protocol basics and maybe OSI model.

Back-end

  • Programming languages: At least one of Java/C#/PHP. Also you it would be great if you have worked with Node.js, Best to have experience with classic ASP cause company, you've applied to, have some module written 20 years ago and they hadn't found a time to rewrite it.
  • Databases: RDBMS: MySql, Sql server.
  • NoSql databases: MongoDB, CouchDB, ElasticSearch
  • Distributed caching: REDIS, memcached or equivalent
  • Formats: XML, Json, Csv


Source code

Typically, all modern companies work with git, but you must know also SVN or Source-safe, because many companies have legacy code base. I heard of company witch has 8 different source control systems, on my opinion this company is absolute champion.

DevOps

Yeah, Its part of territory. Unless your company have dedicated DevOps team, you will be in charge. It is all about delivery, however comprises many skills such as configuring, scripting and monitoring.

Methodology

Software development is complex process that need to be managed. That part is easy, you just need to know who is your scrum master. Just kidding, Every methodology has its own pros and cons, but you at least must know how approaches are differ.

Impressive, ah?

The list is prepared, considering my personal job search experience for last years. If you have something to add, please do it in comments.