Adoption of Agile methodology is going through hard, painful process and many organization are paving their way with customized version of flavor. I get very curious to hear stories from different professionals from various organization about how they made it agile work as a work culture.
Of Course Agile or Scrum its just specification… an abstract specifications and team adopt it as their understanding, circumstance, client and nature of work. During the course, you may encounter various cases, where you might find team overrun couple of very core and important Agile aspects and follow the old age waterfall mindset.
Measurement of individual velocity is one of them.It may not be something new to many of us, but it's for decision of consideration of individual velocity in Agile burn down charts.
In one of the project, we had received more and more requests to add individual velocity measurement in Jira tracker. Senior Management wanted to see this information and use for iterations planning. And as suggested we started for a week, but then realization came is it really required to measure individual velocity? It was not clear initially, but there are some serious problems with individual velocity for sure which works anti Agile philosophy.What caveats such calculation has?
Individual velocity is a measure of how much effort a person may complete in a defined time frame. In Agile, each task gets tagged with a time frame iteration in hours or points.For e.g. If Tom burns more sprint points for several tasks within a week and Jerry burns less for the same week, we should say that Tom has better velocity in the last iteration. Does it mean that Tom is a better and faster developer? Judging to yes for this answer is not straight at all. There are hundreds of reasons why Jerry completed less. Being a part of collective ownership, He helped other developers with tasks and mentored them, one of his tasks was underestimated due to unexpected performance problem with third-party component or he was feeling low for a day or two and had almost no progress. We can bring many more reasons in the table. Performance in the last iteration says nothing and the worst thing to count.
Then another idea came what about average velocity? Will average velocity help us to make correct iteration plan? If we sum up individual velocities all developers will it help us to create a better iteration plan? No, since we already have Iteration Velocity metric and it will be exactly the same. Why should we care about individual velocity, in this case? To make better assignments for each person? Is it helpful? Maybe, a bit.
Individual velocity measurement has the wrong focus on individual performance. Agile recommends focusing on team performance, individual performance is not important. If an individual resource knows that his velocity is measuring, he maybe will not help other team members a lot. He will focus on his performance as an individual developer. The worst thing company can do is to bind bonuses to individual performance. This nips teams in the bud a bad.
Individual velocity measurement forces work assignment while in agile teams it is all about work commitments. In agile methodology, any velocity is a team velocity, by definition.The right solution is to measure team performance with the performance metric a very good, simple and helpful that enough for iteration planning. Individual velocity will only create unhealthy competition, backstabbing and introduce cat mouse race with direct impact on quality. Individual velocity would/can/may lead to individuals trying to ensure they look good at the expense of the teams overall goal - and that is to deliver to the customer. Team should do a commitment to complete as many user stories as they feel can be completed during next iteration. Through every iteration planning meeting, team starts to learn the strengths and weakness of the team as they working together sprint to sprint and will try to find a pace with more robust commitments in total. The team soon get to know who is pulling their weight and who is not through the daily meetings and then they can do something about it. If you measure individual velocity you tend to assign stories based on numbers you have in hands rather team commitments team will fight each other to point out who is smart and who isn’t. “Hey, are you kidding? You did only x points in the last sprint, how are you committing more?”. Individual velocity may de-motivate people, and many managers having it in hands will use it incorrectly. It is very common to revert back to muscle memory of waterfall days and make assignments instead of commitments.
Then “How about recognizing talent for rewards”? Management and even each employee expects a factor to measure his performance. If we only measure team velocity then how do the find the visibility and productivity of each engineer on the team? If team velocity is a basis for productivity then you are flying blind when it comes to understanding if each engineer is being productive and pulling their weight or not. This is very big question where I see most of us are confused. I don't know the right answer, but my experience says, This should be addressed or measured with contribution of the individual developer to the team’s productivity, automation, competence, speed. Each person will vary here and its measurement.
You must have to care for each team member to have a great team. If the team’s win is coming as the result of one great individual but 10 player that are just OK and when you lose that one great player? All of a sudden you have a losing team. So team should be pretty careful about that and complete transparency is the best practice in my experience.
In the end, I think individual velocity is anti-Agile and harm to the team commitment, collaboration and breaks the rule collective ownership. Rather than individual velocity, I would recommend leadership to measure the contribution of individual to the team’s productivity, automation, competence, speed to understand the contribution.
Kubernetes is an open source system for managing containerized applications across multiple hosts, providing basic mechanisms for deployment, maintenance, and scaling of applications. I got a requirement to set up Docker based Jenkins Continuous Integration environment which is scalable on the fly using Kubernetes container services. Digging through any open source solutions yet discovered, I decided to come up with Draft solution. This work pretty well with all initial assumptions and required needs.
Architecture workflow mainly consists three major components
Jenkins Cluster Manager
Jenkins Kubernetes Cluster
Private Docker Registry
1. Jenkins Cluster Manager
Cluster Manager is a processor instance running with Python Flask and Celery framework. It manages the Jenkins cluster through Kubernetes API. It has responsibility to communicate with Jenkins Master and works on the incoming instruction of ramp up and ramp down of slave nodes.
It manages the cluster through resizing Jenkins slave replication controller and if needed ramp up and ramp down minion nodes to accommodate the increase in the load of Jenkins jobs. It returns newly created slave instances(minions) to the Jenkins Master, so Master can ssh into slaves and execute jobs.
2. Jenkins Kubernetes Cluster
Kubernetes is an open source implementation of container cluster management. Jenkins Kubernetes cluster consists one master node and a group of multiple and expendable minion nodes. Minions cluster do have a Jenkins Master instance and remaining Jenkins Slave instance. Jenkins slave nodes in Kubernetes cluster are elastic and can be easily ramp up and ramp down through kubernetes API with replication controller.
Jenkins Master by itself is the basic installation of Jenkins and in this configuration the master handles all tasks for your build system.It controls available jobs to process, and if the number of jobs in a queue increase after a specified limit, it kicks sshd and start a slave agent. It also takes the decision either to ramp up or ramp down slave agents nodes on the fly. To make this in reality, it set up two-way communication with the Jenkins Cluster Manager, an outside processor manages the cluster behavior with resizing replication controllers and ramp up and ramp down of minion nodes.
There are two main replication controller which manages the Jenkins Master and Jenkins Slave pod respectively.
Jenkins Master replication controller :
Master replication controller manages the execution of Jenkins Master docker image in cluster. It configures the one minion with Jenkins Master instance. Throughout the lifecycle, it will work with size of one most of the time.
Jenkins Slave replication controller:
Slave replication controller manages the execution of Jenkins Slave docker image in cluster. It configures one to many minions with slave instance. Throughout the lifecycle, it resizes the running instances of slave images as per the instruction given by Jenkins cluster manager(Stormy).
3. Private Docker Registry
Private docker registry is a GCE instance manages the docker images as a repository. It's only exposed to the internal nodes of Jenkins cluster. All nodes can pull and push docker instances.
Setup Kubernetes cluster on local
Instructions for setting up Kubernetes with GCE on your local machine.
Build & Deployment.
All the instruction about the build and deployment as been added in README in a git repository. Feel free to checkout and update in case necessary. I am sure many things are messed up.
This project certainly has a lot of bandwidth for refactoring and rearchitecture. Couple of things I feel can be good for refactoring
- Develop Stormy solution in terms of Jenkins Plugin:
Currently Stormy is running on a separate node and managing the Kubernetes Master and Slave. In this solution, I think we can redesign the Stormy to be a part of Jenkins Plugin, which can be installed on any Jenkins Master server. Stormy should only control slaves using Kubernetes REST API, with the interim status of Jenkins Master.
The world is full of hardworking and aspirational people who are doing wonderful and extraordinary things. I feel fortunate to know, to read about them and to learn a lot in the year 2014. It's great to use my blog to highlight as many more. I’d like to shine a special spotlight on these 10 influential people(or a group of people) on my chart inspired me in 2014.
Rejected Yahoo's 1 billion $ offer in 2006, when facebook was nothing. This man gets most of the credit to driving successful journey of facebook with recent worth 200 billion $ by September 2014. Having the strong belief of "If lot of people have access to more information and more connected, it will make the world better." facebook not only helped people to connect through socially, but drove the one of the biggest Egypt revolution of Modern history, changed the political equations of Indian elections. He inspired me for his attitude of build something for the long term, anything else is the distraction and find the things you are super passionate about.
Jeff Bezos a founder of Amazon which is not only the greatest tech story of the 1990s but it’s also one of a few contemporaries still run by its founder. He is the one who saw the fall of amazon share price from 100$ to 6$ in front of his eyes, but remain calm and stayed positive. It's one of those qualities makes me feel great about Bezos. He cast every challenge as opportunity and one of those personalities who takes all decision on data, not judgment or instinct. He has also ability to handle many minute things while maintaining the longer goals in mind.
Amazon is immensely valuable today. It has successfully entered in those domains which no one ever thought. Nobody else reinvests almost every cent of profit in growth, as Bezos still does.
The more I read about Jack Ma, more I found interesting his personality. Ecommerce business Alibaba started in apartment 1999, now bypass Walmart in net worth.
I am impressed by his vision of using technology to alter the existing standards alter the user experience, which has social, economic and political impact on the society beyond just an e-commerce platform. 21st century belongs to Asia, and, of course, such visionary leaders would have more impact on their technical arm.
Working in the designer shop, I may be little biased with him, but whatsoever I am impressed with Tony Fadell. Working with HUGE one of our goal is to combine the strength of design and technology for the betterment, and now if think about Tony Fadell 'A passionate, brilliant engineer' I should consider him as a role model. Combining design, engineering and entrepreneurship its one of the toughest task. Tony did all this twice: with the father of the iPod and smart thermostat at Nest Labs recently sold to Google.
Freedom is individuals right, world can be more creative and beautiful if every individual becomes real get this founding principle to practice. And for the sake of this basic right, Edward Snowden a computer genius has chosen to do what is right rather than what will enrich him, and he has chosen to do what is right rather than what is lawful.
He gave us a window of opportunity in which to make an informed, self-determined choice about the global system of surveillance for the sake of his life, career and future.
Malala’s drive, passion and perseverance in standing up for education and girls’ rights in Pakistan and around the world is extremely moving. She is a true human rights champion and a worthy recipient of this year’s Nobel Peace Prize.
The Ebola Fighters
"Not the glittering weapon fights the fight, says the proverb, but rather the hero’s heart."
These brave hearts reached from wealthy and safe countries like Germany, USA, Spain to slums areas in Liberia, Guinea and Sierra Leone having risked and persisted, sacrificed their lives and saved millions who could be next victim unless they act hard and fast selflessly.
World is safer now from Ebola, and their sacrifice count more than anything else.
India a world's largest democratic country have two dozen national parties, more than hundred regional parties. Dealing with issues of coalitions, corruptions, boneless decisions, cast politics, uneducated people, most Indians believed that their country has lost its way as its growth rate has been almost halved while inflation has soared. And now India have Modi, the person who reversed every one of those traits by his charismatic, intense, utterly decisive personality. Former head of Gujarat, one of India’s fastest-growing states and now sworn in as Prime Minister of India on 26 May 2014 Prime Minister.
His leadership skills, right use of technology to do the right task is unmatchable in world's political circle.
Rightly said, if Japan wanted to tell the world it was going to stage an economic comeback, telling about Abenomics would be the better way. Shinzo Abe seems to be one of the strong political figures I remember for this year who is the designer of bold set of strategies to defeat deflation, ignite consumer spending and restore economic dynamism. And all this happens within just 20 months. His strong commitment to the big task and make the things work in the political circle is awesome. I am amazed how single person can enforce strong relations within in Asia to counter China. If you have looked his twitter handle and the people he follows, you will understand, the vision to restore the pride and strength of Japan. Hats off …
Angela Merkel is a leader who really paved the way to transform of the German from the dark shadow of history. Her leadership for 2006 world cup as a host to perceive a team of young, hungry and decidedly “un-German” team. Her firm support for her thoughts made Germans ultimately embraced the new approach. After the world cup in 2007 financial crisis, she once again had to convince skeptical Germans that change was needed to rescue Europe’s economy. The quality of her leadership firm, measured and agreeable helped return Germany to a place of respect in the global arena.
Jenkins CI tool is backed by very strong active open source community which developed hundreds of very handy and useful plugins. While going through couple of existing pipeline in couple of teams, I have seen developers have tried to reinvent the wheel in many cases with adding all sort of nancy fancy, half tested logic to accomplish tasks, and nonetheless I was one of them. If I look back and asses, there were tons of handy plugins which could solve the use case with very minimum pain and could promote reusability across the projects.
I realize it's good to note down those plugins which I found very handy in day to day job of ours. I understand things are changing rapidly this domain, so I assume this post may be stale in very near future.
Managing a pipeline in Jenkins expects moderate configurations across all the jobs participating in the flow. Configuration can combine different types including parameterized build, parallel builds, joins or downstream wait. With the addition of more jobs, it gets quite complicated for further updates. The build process is then scattered in all those jobs and very complex to maintain. Technically individual Jobs are meant to carry the responsibility for their unique task but with this pipeline configuration they also carry such this joins connection details which pollute their goal. In this scenario, Build Flow Pipeline comes to the rescue. This plugin is designed to handle complex build workflows (aka build pipelines) as a dedicated entity in Jenkins. Build Flow enables you to define an upper-level Flow item to manage the job orchestration and link up rules, using a dedicated DSL. This DSL makes the flow definition very concise and readable. Main jobs don’t know anything about the pipeline as everything is externalized to the flow.
The only missing with this plugin, it doesn't have much support for graphical visualization on monitors. There is a Build Graph View Plugin but it didn't intend what someone expects. If graph view doesn't matter you most, then this can be best plugin to try out, or else go with regular scattered configuration.
Visibility is the core aspect of Jenkins CI tool. Being understood CI is a part of collective ownership, everyone should know if something breaks, some part is not doing well consistently. And to make it in reality, having that projected on a monitor visible to all is the welcome move. Build Monitor Plugin provides a highly visible view of the status of selected Jenkins jobs. It easily accommodates different computer screen sizes and is ideal as an Extreme Feedback Device to be displayed on a screen on your office wall.
Every build comes with build number, but most of the time it's hard to identify a particular build with build number.Many types of build get executed with an update from the revision number by source code, so it would be a great deal to have a revision number as a unique identifier.In order to visualize the actual revision numbers within Jenkins, the Build Name Setter Plugin can be used instead. This makes it easier to identify builds by revision number instead of by build number.
As said earlier, visibility is the core aspect of Jenkins pipeline to be successful in terms of its value.This plugin helps renders upstream and downstream connected jobs that typically form a build pipeline in very nicely fashion on the monitor, big monitors specially. In addition, it offers the ability to define manual triggers for jobs that require intervention prior to execution, e.g. an approval process outside of Jenkins. This would help other decision-making teams(NonDevelopers like QA, BA or another kind of authority) to continue the pipeline
Build-timeout is simple but necessary.
This plugin makes it possible to archive the workspace from builds of one project and reuse them as the SCM source for another project.This is useful in terms of avoiding space issues, and copying over same source code which is not absolutely needed in the couple of cases, resulting faster execution and feedback.
This plugin integrates Cobertura coverage reports to Jenkins. If testing framework in your build job creates reports aligned to xUnit standards, this can be handy plugin to project the progress in nice charts and detailed format.
This plugin allows you to show the results of Cucumber tests within Jenkins.This plugin really helped the team to accommodate the BDD development style. Cucumber plugin formats the raw reports into very nicely and visible charts which can be easily understood by Non-Tech folks like BA and Product owners.
This plugin visualizes Delivery Pipelines (Jobs with upstream/downstream dependencies). This is somewhat similar to Build pipeline plugin but has very lean design. This is favorite plugin across the teams here out in my company.
This plugin is a replacement for Jenkins's email publisher. This is more advanced plugin with better features for sending build status messages. Please make sure you setup very granular and effective way of communication to the responsible team rather than the whole team.
This plugin integrates GIT with Jenkins. This plugin also added feature of notifying the build about git code base updates using REST API. This is very useful feature where Git Hooks can notify the builds immediately rather build wait for Git poll interval.
During concurrent execution of jobs, Heavy Job Plugin can be used to allocate all available executors on that node in order to ensure exclusive access to all the local repositories.
This plugin is a HipChat notifier that can publish build status to HipChat rooms.This plugin adds more visibility and awareness in terms of build status into the team resulting more sense of collective ownership.
This plugin allows you to capture code coverage report from JaCoCo. Jenkins will generate the trend report of coverage. This plugin is a fork of the [Emma Plugin]. Big part of the code structure comes from it, however, it is completely refactored. It also includes functionality similar to the [Emma Coverage Column] which allows to include a column in Dashboards which displays the latest overall coverage numbers and links to the coverage report.
If you are thinking of setting up parallel jobs in pipeline, you may end up in a scenario known commonly as 'diamond' shape project dependency. It means there is a single parent job that should start several downstream jobs. Once those jobs are finished, a single aggregation job runs. This plugin allows a job to be run, after all, the immediate downstream jobs have completed. In this way, the execution can branch out and perform many steps in parallel, and then run a final aggregation step just once after all the parallel work is finished. More complex interactions are not possible with this plugin.
NodeLabel Parameter Plugin can be used to assign the cleanup jobs to the specific nodes. This plugin adds two new parameter types to job configuration - node and label, this allows to dynamically select the node where a job/project should be executed.
This plugin lets you trigger new builds when your build has completed, with various ways of specifying parameters for the new build. You can add multiple configurations: each has a list of projects to trigger, a condition for when to trigger them (based on the result of the current build), and a parameters section.
This is very handy plugin in terms of Performance testing. This plugin integrates JMeter reports, JUnit reports, work output, and Iago reports into Hudson.
In scenarios where multiple pipeline executes in parallel, build steps of different pipelines oftenly expected not to get execute in a random order. For example, deploying artifacts of a pipeline to a live server cannot be succeeded by deploying artifacts of another pipeline earlier than a smoke test has run for the already deployed artifacts. This can be guaranteed by assigning a higher priority to the smoke test job using the Priority Sorter Plugin.
Sometimes a step in the pipeline might fail because of some technical error that is not related to the associated revision like Jenkins restart, or out of memory issue. In order to trigger a rebuild of the failed downstream job the pipeline parameters revision number and build number need to be specified manually, which is a bit awkward. Here the Rebuilder Plugin comes in handy, which facilitates rebuilding a job with the same parameters as the failed build.
This plugin allows to share workspaces by Jenkins jobs with the same SCM repos. It saves some disk space and repetitive steps if you have different jobs with identical repos. Importance of this plugin is not well understood by the developers, considering the memory is cheap. But following standard practices and promoting reusability can be fruitful in the future.
This plugin allows you to provide SSH credentials to builds via a ssh-agent in Jenkins.
You can use the SSH Plugin to run shell commands on a remote machine via ssh.
This plugin allows you to manage slaves running on Unix machines over SSH. It adds a new type of slave launch method. This launch method will open a SSH connection to the specified host as the specified username. Once it has a suitable version of java, copies the latest slave.jar via SFTP. Starts the slave process.
This plugin adds the Subversion support (via SVNKit) to Jenkins.
This plugin simply backs up the global and job specific configurations (not the archive or the workspace). One of the main features is automated backups. This is far better then Backup Plugin.
The Throttle Concurrent Builds Plugin can be used to define throttle categories and restrict concurrent execution of jobs by assigning them to the same throttle category.
A wall display that shows job build progress in a way suitable for public wall displays. Rendering is performed using ajax based on REST API calls, so requires no page refreshes. It's one of the plugin you would like to give a try.
One of the commonly recommended tasks of Jenkin Job is to cleanup itself after build is finished to maintain immunity for next build. I have seen most of the time teams uses ‘rm -rf *’ somehow in script which works fine but doesn't cover bad scenarios. This plugin is exactly meant to save us from this granular job. This plugin deletes the project workspace after a build is finished.
This plugin makes it possible to record xUnit test reports.
Setting up Jenkins pipeline seems to be one of the key task achieving ideal way of adopting continuous delivery. While going through this phase, we are going through a lot of new learnings, with the aspect of different team development cycle, technology, platform needs and clients expectation. This place is a great place to document best practices to set up Jenkins jobs.
- Break Job to a granular level: A single Jenkins job to perform multiple tasks is not ideal. Jenkins is a just a build tool and it's not smart enough to know which step has been failed. The essence of creating a pipeline is breaking up a single build process in smaller steps, each having its own responsibility. In this way faster and more specific feedback can be returned.
- The most reliable builds are the one which builds clean and builds fully from Source Code Control.
- All Jenkins builds must follow the packaging principle. Build Once, Deploy Anywhere.
- If you are having own instance of Jenkins, make sure it's secure with user credentials.
- Right usage of plugins is highly expected. There are tons of plugins available for free in Jenkins marketplace. Quite useful plugins are
- Delivery pipeline plugin
- Join plugin
- Parameterized Trigger Plugin
- Clone Workspace SCM Plug-in
- Build Monitor Plugin
If anything goes wrong in critical deployments, first and foremost thing comes in mind and that is Rollback. Considering its importance, still rollback strategy is most undervalued concept in Jenkins jobs and pipeline setup.
- Revision number: Every Jenkins pipeline should use of pipeline revision number across its execution.
- Define a pipeline that is strictly associated with a single revision within a version control system.
- Code base should always go through step of Tag, label, or baseline after the successful build.
- Always Bootstrap Jenkins workspace from scratch to update with working copy prior to running the build goal/target.
- Always configure your job to generate trend reports and automated testing when running a Testing jobs.
- Use of public key authentication: By setting up the public key mechanism, anyone can log in from one system to another system without ever typing password. This is the real timesaver useful for Jenkins.
- Use of Labels: Sometimes it's good to keep more diversity in build cluster. And one of the way to manage the diversity is using labels to a particular node. Right usage of the label helps team in the long run to identify the uniqueness of each node and help them to use it for rightful purpose.
- Parallel execution is a great thing to see the results and feedback quickly. Every pipeline should find out the list of jobs which can be executed in parallel.
- Every job should include relevant script to clean up the operation after completion to maintain cleanliness.
- Jenkins should also include maintenance jobs such as cleanup operations to avoid full-disk problems.
- Always no to Build Record Sprawl. You should discard old build with the configuration option.
- Periodically team should archive unused jobs eventually removing them.
- Almost every pipeline jobs eventually outgrow the ability to run builds on just one machine. Everyone should take Advantage of Distributed Builds. In larger systems, make sure all jobs run on slaves.
- Set up email notifications mapping to developers in the project, so that everyone on the team has his pulse on the project's current status.
- Use of hipchat plugin, logging system is recommended.
- Take steps to ensure failures are reported as soon as possible.
Cough...Cough…! Back in days, my family and friends used to remember me a coughy guy, used to catch serious cough infection at least four times a year. And when I used get it, it lasted for two weeks or more. It was a frustrating experience, as this episode was going since last couple of years or more. Each time I had to try more concentrated cough syrup to get rid of it. To overcome with my anxiety, I changed my physicians, hoping previous one was not good. But as stupid my attempt sounds, more worst were outcomes. It never worked out…in short.
Every Time I asked doctors, how to avoid this crap and then I always used to get mostly one type of response. You have to be more healthy, change your diet, do exercise, improve your immune. Ohh god… no doubt all tips make sense, but how can I make it effective. I am vegan, do regular exercise, have control diet. What else you expect, a solid athlete… or body builder.. or else.
Anyway, the same frustration came one day in dinner table discussion at someone’s place when I was in casual chat with the person next to me, hearing this episode he immediately got interested and for next 10 minutes he immensely narrated how much he was too frustrated with same issue. He even told he used have often visited each year by primary physicians. After a long time, I relaxed and felt someone is here with a similar mess… I so mean by the way, but surprisingly the next tip he gave has completely solved this headache.
His tip was simple and very effective, “Fill your body with Vitamin C”, that's it??? yes, that's it. His experience was great, he said consider your body has stock of vitamin C. If stock finish cough comes, and if you make sure you never allow stock to go down, you hardly ever get cough. Motivated by this next for a month I tried to drink daily two glass of orange juice, weekly two vitamin C supplementary packets. And voila… my cough is gone. I tried this trick for every 3 months, and now If I look back its more than 18 months and I don't see catching a cough at all.
Simple trick, easy to follow but it never clicked my mind. Now If I remember back in days, each time doctor also used to tell me the same tip, but most of the time this tip used to get dissolve with other dozen tips in my mind.
Whatever, I see there is one thing is there to learn in this episode, never lose attention when you get multiple things. Weigh each option one by one, and always start with easiest one. It could help and save your time.
“Do you have any tips to learn this programming language… in a shorter time???” If I am correct this question I might have asked many folks at the younger age of programming world, and surprisingly I now hear same question getting directed to me (I realized I am not the only one… who was crazy to ask this) by many freshers, novices in office, tech meetups or community groups.
The answer to this question...which I at least used to give is pretty straightforward… in fact its ISO 9000 certified answers… like get a good book, start with coding demo application, form learning groups, devote time regularly… although no one can deny these but in reality I was never confident of my certified answer.
Just last week, I have picked one iOS prototype project to code, and as a newbie to iOS ecosystem, I have been asked the same question again… but this time asked was me. Hence for the first time I was curious how can I come up with effective steps which can certainly fuel my language learning. Gearing for the mission, I spent couple of minutes to find out what other experts suggest for the same problem, I gathered many of them which made sense.
After a week of development, and assessing those tips, I filtered, corrected many of them. So here is the final list of tips which made sense to me. Hope it helps others as well..
Get the real concept of the language:
This is the first and foremost important tip. Different languages are designed to solve different types of problems. Going back to basics, sets the mindset and expectation what could be the next journey.
Gather all relevant material at first:
We don't start a long journey without getting stuffed right accessories, same applies for this case. Getting right tool, the right source of documents and a possible help of real live resource to fix quick mess up would be most important. Real help could be your colleague, friend if none possible easily through StackOverflow, healthy ad-free twitter groups like code newbies, flatiron school are best options.
Truly, Understand the Documentation:
It's very important to thoroughly understand core prefix and indexes of documentation at the front. It helps to avoid very common type of frustration most of us get down the line when right information needed. This tip is highly undervalued among all but knowing it on time will really make a difference.
Find a Cheat Sheet:
Every programming language comes with the set of quick cheat sheets for common commands, most used functions like logging, debugging. It's also important not to miss it at the front.
Relax and take a break:
It makes sense that once you've done the gathering of materials, reading and understanding the basics, to dive right into piecing together a demo application.
But, in order for proper learning to happen, you have to let the information marinate in your mind over the course of a few hours. Best take a break for a day and let the information seep in your head overnight.
Learn with Short Examples — Don't try with a big project:
It’s important to focus on an individual aspect of the language at the beginning in isolation of others. Big project always carries many aspects of the language and other third party systems which can derail the learning in the initial days. Integration with other aspects is best learned once you have a solid foundation in the language.
Type in All the Code Examples Yourself:
If you are damn serious about your business, what you are trying to achieve here then this tip is more practical. You have to be a maniac about typing while you learn. Typing stimulates memory and retention along with questioning mindset at each step, self-learned and much much better than glancing at them in a book or in a video. Down the language new language doesn't matter much, what matters is patterns, syntax and typing in the examples and making them work is perhaps the most important part of this learning process.
Make It Run! :
I think one of the key best way of learning something and also manage growing interest by having smaller accomplishments, either it may be assignments, challenges or bug fixing.
And all this won't happen in learning until close the door behind you before opening a new one. Always, always, always make your program run. Debug it until the result is correct.
Rely on Real People:
Reinventing a wheel while learning or coding is highly undesirable. But the truth is it happens quite often knowingly or unknowingly. There might be a case where new beginner stuck in very silly issues which takes hours to fix or understand but can be solved within a minute by an experienced person. So its always better to have a backing of the real person when needed.
There are different places where you can look for help, like office colleagues, stack overflow, language's forums, meetups or outside resources like twitter.
Make a Time Commitment for Learning:
Context switching the major term you might hear while working in the software industry. If you move your mind from one work to other, you have to go through at least 15-20 minutes before settle down to newer task if they belong to different domains or context. Same applies while language learning. Learning in large, uninterrupted chunks is the best way to really soak in the language. Small learning sessions over the course of the week aren't that productive for learning a language than blocking out a day or two where your schedule is free for other tasks.
Break the boundaries … Go One Step Further to be a master:
Finish each lesson, labor exercise and also try to take it one step further with related scenarios or problems. Doing this has a couple of advantages, you get familiar with language documentation that main, but you also get reinforce the concepts in the lesson.