What is Qos (Quality of Service) ?

What is Qos (Quality of Service) ?

The Quality of service or Quality attributes are most important for any Architecture, The Architect’s responsibility also consist of maintaining these services, well defined in any project and communicate the same to the development team. The QoS mostly consists of below services.

Other services like Performance, Interoperability, Usability, Maintainability etc are also very important. I am not discussing them here as I am trying to take the things very common and most important for any software application. As I am a JEE Architect, my examples and explanations might be of Java and related technologies.

Availability:

This is a very important service in the list and it means, the application you are working on should be available whenever the users are expected to use. This intern means it should be available 24 * 7, because of the distributed applications we have these days and users on almost all the countries and continents. To make this happen we might put the application in a clustered servers with a load balancing mechanism. This way we can make sure even if one server is down, the application requests can be served by other server in the cluster. Read more >>>

Manageability:

This is a very confusing concept as it is difficult to find difference between manageability and programmability. Although the lines are blurry between these two they are different and Manageability deals with the management of software. For Eg; How you manage your versions of the code? How you manage your build with any CI tools? How you configure your application itself? These kind of questions would come under Manageability. Read more >>>

Security:

Security is a key service any application should provide, the data of any application can’t be compromised, in some cases the code also. This is the thumb rule of any application. To keep the security there are some guidelines given by all programming languages which can be followed. I can give some examples for Java and .Net. The key features of the application like authorization, authentication, Encryption/Cryptography etc are the things should be taken care here. Read more >>>

Scalability:

Scaling any application is a challenge. We are in the cloud era and the hardware can be automatically scaled with the cloud providers. But still the software or the code we have written should be able to scale for the requirement of the future. This challenge is all about planning, usually we consider the application scope is very small and choose the technologies very much relevant for that scope, but after couple of years we start getting the response delays etc. Read more >>>

Reusability:

Reusability as a concept it is very easy to understand, all we have to do is “Re use” already existing things/ components / code / template etc. However the implementation of reusability in a real time project is not that easy. Very often we tend to copy paste the code instead of moving the code to another cohesive method, there could be many reasons to do that. At higher level abstraction like Component re use is much more difficult than a method or class. I feel identifying the use case itself is harder than implementing the reusability. Read more >>>

Portability:

Portability is often a thing which was not thought trough in the beginning of the development and be done ad hoc when it is needed. When we say portability, the application you develop should be portable to different environment all together, For eg; It could be moved from one OS to another OS or from regular environment to cloud. This is the part of portability.  Read more >>>

Other useful reference ->

Talk on Scalability, Performance and Reliability by Cameron Purdy

Portability and Reusability Chapter from Mcgraw-Hill.com

The Architecture based Design Method

My Notes of GIDS 2014 Web n Mobile Day

My Notes of GIDS 2014 Web n Mobile Day

I attended the Great Indian Developer Summit 2014 for couple of days ( Java, Web/Mobile Days). The below is my notes of Web/Mobile day(23rd April). I could get lot of information from this summit.

Web/ Mobile Day:

The day started with a wonderful Keynote of Scott Davis, who told us how a young developer should be, The key message he gave is “If you can’t type it…, … You can’t script it away“. If my understanding is correct, all he wanted to tell the developers is try to have in-depth knowledge on each everything you program. He told this in many funny ways, Keyboard is always faster than mouse, How he is going to teach the Minecraft programming to kids of age 10. My favorite one among these is – “Success breads success…. and Confidence” and “Be a Kinesthetic Learner” 🙂

Thanks a lot Scott for the super message.

There were few more keynotes (Sponsor) and only one impressive note was from Ravi Pal – Sapient, He talked about – “Future of Experience – a view for a technologist” was interesting to know about some facts and innovations around retail industry.

Then comes to Guru of technologies Venkat Subramaniam, and told how to modularize your Java script code. We always know what not to do but we tend to these mistakes when we have to code. He pointed the things rightly about these common Bad Practices of JS. How to Create Classes and Export these classes to other files and many more. I really appreciate him for iterating these facts.

Then the exciting session happened was on “Getting started with Building your first IoT solution” by Raghavendra Ural. This Intel session was impressive for me because this is the first time I saw the code of IoT and the movement I came to know that this is a pretty simple code to do, I was very happy. This Intel Galileo board is $60 USD and very small in size than Raspberry pi. This has a Pentium processor, and we can run a Node Js server in this.

Feeling Awesome right !!!! 🙂

Finally I attended the thirsty head Scott’s “YeoMan – Modern Workflows for Modern WebApps“. This is really useful stuff if you really interested to know where the world is going. I didn’t hear the name YeoMan before today but learnt that this is a very useful tool if you are from Node JS world. The scaffolding is pretty easy with YeoMan. He introduced us with some other two new tools called Grunt (A build tool for JS) and Bower (Client side dependency management).

Of-course I enjoyed participating many different contests and produced lot of Dopamine 😉

Conclusion: My aim of attending GIDS Web & mobile 2014 was, to know something new which I am not aware of. And to get a feel of new technologies via “Demo” applications the speakers give, it was really amazing to know many different Tools, Frameworks, APIs, principles and concepts via GIDS. I must say I enjoyed this Summit thoroughly.

Thinking in OO way

Thinking in OO way

Most of the times when we get new developers in Java World, as senior developers and Architects we advice them to think in OO way. What does it mean? We may take some example within the project or in general like Vehicle as ” Object ” and list down the properties or attributes of any vehicle and list down the nationalities which are common for all vehicles to define the interfaces.

Then we will straight away move to inheritance, encapsulations, abstraction concepts. But if we take a step back and think why these names are given for these things in Java by learning their real meaning of these words, we might explain things in Java in a different way. And for the learners also it would be much easier to relate Java to reality.

Object Oriented Programming (OOP), If I understand the philosophy behind Object correctly, “A material thing that can be seen and touched.” Are our Java Objects can be touched or seen ? That is not the reality, so our Objects are the simulations of real world objects. That’s the reason why Java is Object Oriented (OO) language. In any real project we take the real objects and try to simulate their properties and behaviors in Java, this is called as OOP.

Then we should understand the other terminology of Object orientation. I will try to cover very important one’s here.

Inheritance, This looks like a biological term if you are not a programmer. It may even look like Law term if you are a lawyer 🙂 , The real meaning of it looks like this – “The process by which traits or characteristics pass from parents to offspring through the genes.”  In our OO context it applies to the classes and their behaviors. It is exactly the same as what we do get from our parents as inheritance.

Encapsulation , This is a general English term used to wrap something in another, The dictionary meaning says – ” to enclose or be enclosed in or as if in a capsule“. It is very easy to apply the same idea to the object. We would like to encapsulate the data inside the object – thinking How? using simple concept of Bean, Using private attributes for class and use getter and setter methods wherever required to access the data in these private attributes. This is how we secure/ wrap / capsule  our data using encapsulation.

Abstraction, This word means – ” Existing in thought or as an idea but not having a physical or concrete existence “. So, Its easy for us to understand when we have the idea on the functionality, but we are not sure what exactly it means. How we can achieve this in Java ? – Using Abstract Class / Interface. We will define interface when we know the common functionality which is abstract  at this point and can be implemented in any way you want in future.

So, this way we should first understand the real meaning of any concept we would like to understand and try to relate the things to the classes, Objects, methods, attributes etc.

Wish you happy reading 🙂

Best example of OO thinking –  This image courtesy – devcv.me

OO thinking
OO thinking
Software architecture Definitions

Software architecture Definitions

Software Architecture has many different definitions, every expert of software industry has their own definitions 🙂

When you search for it your first result is most probably the Wikipedia which defines as below,

Wikipedia

The word software architecture intuitively denotes the high level structures of a software system. It can be defined as the set of structures needed to reason about the software system, which comprise the software elements, the relations between them, and the properties of both elements and relations.

Description: It talks about the high level plan / structure of a system / application, and architecture is the set of structures needed to build the software / application. It also says the relationships and properties of elements of the system is also important to consider.

IEEE-1471

An architecture is what is fundamental to a system — not necessarily everything about a system, but the essentials.

The dis-junction, concepts or properties, was chosen to support two different philosophies without prejudice. These philosophies are:

Architecture as Conception: an architecture is a concept of a system in one’s mind;
Architecture as Perception: an architecture is a perception of the properties of a system.
Under either philosophy, an architecture is abstract — not an artifact.

Description: IEEE completely took another dimension of Architecture, It says architecture is very abstract but it shows you two different perspectives of architecture. Finally it says Architecture is not an artifact, but still it has to be documented well. I will discuss how we can document the architecture in a different blog.

Microsoft – 

Software application architecture is the process of defining a structured solution that meets all of the technical and operational requirements, while optimizing common quality attributes such as performance, security, and manageability. It involves a series of decisions based on a wide range of factors, and each of these decisions can have considerable impact on the quality, performance, maintainability, and overall success of the application.

Description: If you re look at the above definition from Microsoft, it focuses on the process, and it says a series of decisions taken over time. So, it is more mature than the previous one as it talks about the quality attributes as well and their impact.If I interpret this definition, Architecture is not a one time thing, it is a continuous process of decisions which may impact your performance, security etc.

My Favorite definition of Architecture –

According to Ralph Johnson and Martin Fowler the Architecture Definition ( Who needs Architect )  – “In most successful software projects, the expert developers working on that project have a shared understanding of the system design. This shared understanding is called ‘architecture.’ This understanding includes how the system is divided into components and how the components interacted through interfaces. These components are usually composed of smaller components, but the architecture only includes the components and interfaces that are understood by all the developers. ”

 

Many other definitions of Software Architecture given by many industry experts consolidated by SEI ( Carnegie Mellon University).

Best Qualities of a Software developer

Best Qualities of a Software developer

developer working

General description of any developer role would expect required skill set, mostly the companies expect java/.net/c/c++.

Most companies even expect the developers to know good language skills and analytically strong. But do we think that should be sufficient for any developer?

Most of us might agree, because we expect developers to code nothing more than that. What are the other skills you might expect from a developer, I might suggest you would be a very good developer if you posses these qualities.

  • Never Give up Attitude
  • Patience
  • Innovation
  • Team player

If I am the hiring manager along with the skills developer posses I would try to probe on these areas. Let me elaborate on why I am thinking these are the key things for developers.

Never Give up Attitude:

Development or writing programs are not as easy as you see from outside.  Even a very simple problem like saving data from brownever give upser to Database  might create some expected errors when you are try. Some errors  /exceptions you get might look silly when you see from outside, but when  you sleeve up and make your hands dirty then only you will realize the  actual problem. As I developed code for more than 10 years I am aware of  the issues developer might get into. So you need to try try and try until  you succeed. I particularly see this attitude in the candidates I interview.

How you will find out “Never” give up attitude?

You should ask a question / program to developer which is almost  impossible to solve in the given time. A very simple way could be give a  small project instead of asking a simple prime number program and ask  him the class diagram and code with in 15 mins. Which he will not be able  to achieve. Then after 15 mins you ask him to show whatever he/she has  done. Developer will immediately say I am not done yet, and he already realized that it is going to take more than 1 hr to finish. If you ask him/ her would you like to attempt it if I give you 5-10 mins? Now you will understand the attitude of the developer. If he/she gives up and say no, even after 10 mins I won’t be able to finish they are not ready for attempt itself. I might not take this developer for my team.

Patience:

patience This is a very important attribute of a developer, I myself didn’t understand why some code is not working at many instances. So, you need to be very patient when you do programming. This is not the only reason why you need patience. The first and important reason you need patience is to listen and understand the requirements of business. Any software’s aim/ objective is to solve the business problem, If you don’t understand that completely and create a solution for it, it might not solve the problem but it might increase the problem for user.

Every time you write code you have to wait sometime to see your code working. If it is a server side coding then you should have to wait for some time to build the application and wait until it gets deployed to server, then test it and find that your code is not working then you have to redo these steps again 😦 Nowadays there are lot of tools like Maven / Eclipse who made our development process very easy but still you have to repeat these steps as a developers many times as part of your Job.

If you don’t have the patience to repeat these steps, you might not be a fit for this role 😦

How to test patience of the developer?

This is a very interesting question, but it is a very difficult question as well. This is something you can’t figure out in a very short time like interview of 30 mins to 60 mins time. But sometimes you should be able to guess based on the expressions of the developer when you try to ask the same question in many different ways to him / her. Or If you have a better approach please comment on it.

Innovation

InnovationThis is an attribute every developer should have intrinsic innovation. I could see nowadays the organizations are very much forcing the developers to come up with innovations, I am not sure how it will work in reality.

Motivating developers to innovate is a good thing. Where as I have seen many ideas not even considered when they reach upper level. I am not saying this is wrong, they might not see the value of this innovation as they have a bigger picture in mind. Sometimes they have to comeback to developers and explain why their ideas are considered to make them understand that bigger picture they have. Other wise this might lead to demotivate developers.

How to identify Innovation ?

Again in a small span it is very difficult to understand and assess this ability of developers. I usually ask developers what is the “NEW” thing you have done in last 3 months apart from doing regular coding. It could be learning new framework, tool or API from development. Some times I get completely different answers like started learning Guitar, French etc. So here there is no right or wrong answer. But this would give you some idea what he /she is doing New in their life, this is a very important thing because developers should be learning new things every day then only they can do some innovative thing.

Team Play

team playerLone development is a past, considering the distributed teams globally I think nobody in today’s world would develop a software alone. Yes I agree with you on, sometimes you might have to go to a quite room and do your coding alone. Team play is usually encouraged for developers as they can learn from each other when they work as a team. And understand each other as individuals also very important to work as team. If you see the business perspective of teams is – if any one person’s unavailability should not stop the show.

How to identify a good team player?

This is a tricky one to address in interview, I tried asking questions like If you get stuck in a problem what will you do? Some developers say I will go to senior developer and ask. This might sound like a team player but he/ she should do a though-rough investigation of the problem and find the root cause of it and still if they could not get the solution from searching all possible online sources then you should approach senior developer. Then you might ask about what you don’t expect from your team members. For this also I got some very different answers from developers for eg, unfriendly, non supportive etc. you might have to probe them to get to what exactly you want to hear as these are very vague answers.

Conclusion:

When you hire a developer you might even think of many more things than these four but I feel these are the most important along with the technical abilities of any developer.

Gamified Software Development

Gamified Software Development

In the recent past I have been learning about “Gamification“. I started thinking if I can think of a development process instead of the regular way how it would be? I mean the Gamified one.

The basic idea of Gamification is focus on the intrinsic and extrinsic motivations of developers. How to find out the intrinsic motivations of developers ? This is the key challenge

Firstly developer should be interested to code ? How to motivate them ? The code quality should go up ?

The usual way the companies deal with is if the developer codes and there is a Bug figured out by Tester/ QA developer will loss his/her motivation, because somebody else is pointing out the mistake he/she has done.

I have seen many times there is a clash between Developer and Tester. The primary reason for this could be “Ego” (accept it or not), this is the reality.

So, to fix this issue and Gamify the process we might say If each developer find a bug in his own code it would be suicidal.

Sharing could be a good motivation – Share what you have done today ? Example – “Fixed 2 P1 bugs today” could be an achievement and developer might get 10 likes for this from distributed teams.

So, developer might like to share and get more likes he/she might try to do more work than expected. If the issue re-opens then QA should comment on I re opened this bug as comment and he/she might get more likes than developer, which motivates developers to test properly before they say it is fixed. This could be an insult to developer and may de-motivate also sometimes.

Getting access / control could be another good motivation:

  • Create a group/forum related to technology or tool you use.
  • Ask all developers to participate and share the knowledge they have.
  • If they get to solve more than 3/5/10 questions asked in the forum would have a special badge (Gold Level, Platinum Level) , Based on Level, the developer get access to more privileged content or may become moderator of that group.
  • This could be pride for a developer and he might learn lot of things to answer the questions of other developers too.

Any other ideas to improve quality of software we produce and Gamify the process would be great 🙂

References:

Gamifying development process by Infosys team

Software Architects & Designers

Software Architects & Designers

Some days back when I was discussing something with my friend over a coffee we had this question. His idea goes like this – “All developers when they become seniors, they do design the system. If any developer with good  designing experience of some years, can become Architect.” I agree the fact, that you need a designing experience to become an Architect, however all designers may not be good fit for an Architect.

I would try to give my own definition of these two roles, let’s try to be on same page, then we can move on with the discussion point Architect Vs Designer.

Architect : He/ She is the one who defines the high level abstraction of the system/ software. The system/software may contain many different components inside. If it has many components then Architect’s job is to define the integration points, choose right technologies to different components, choose right tools & methodologies for these defined components. In some cases Architect even can influence the development process like introducing new step/ stage for code review and test with code static analysis tool before checking the code in to repository. He/ She is responsible for non-functional requirements like Scalable, Maintainable, Flexible, Available system.

Software Designer is not a very regular designation in software companies. So I would consider a Sr Developer / Technical Lead who is designing software for some years.

Designer : He / She define the low-level of the abstraction,each component should be designed by Designer to meet the functional requirements of that component by not compromising on Performance and Scalability of the system. Designing detailed interfaces and implementation of them.

I would like to map the things in a tabular format, for easier understanding.

Architect Designer
Vision Strategic (Long term – Alignment to Business) Tactical (Short term – Integration between modules /components)
Abstraction High Level Low level
Defines Skeleton of the System Fill the Skeleton with Designing the details
High level components Design each Component
Involved When ?  “What” Phase of the system “How” Phase of the system
Focus Area ? Non Functional requirements (Scalability,Availability,Flexibility etc) Focus – Functional requirements
Suggest Frameworks, Methodologies, Integrations, Tools, Technologies, Patterns etc Best Practices, Applying Design Patterns, Design Considerations
Create Component Diagram, Interaction overview, Deployment, Use case, Class, Package(optional) Class, Package, Object, Activity, Sequence
Document Architecture Overview, Integrations, Design Decisions Design Decisions, Best Practices, How to ..s ?, CODE

Finally a pictorial view

Architect_Vs_Designer

I hope this is useful for the people who are trying to understand these roles. Thanks

Useful references :

Software Architecture defined by Carnegie Mellon University

Learn UML Diagrams and their Importance

StackOverflow Architecture Vs Design Discussion