Latest News

Thursday, June 16, 2016

How To Be a Superhero Software Developer, Agile or Not

If you've seen any trailers for movies lately, you know that superheroes are the new hotness. In a blatant rip-off of the genre, our Agile Architect describes how to have your own secret origin as a super software developer.


Everyone who knows me knows that I collect comic books. I've long passed the days when I was somewhat ashamed to admit that a grown man's favorite super-hero is The Green Lantern. Now I'm taking the next step and writing about them in my purportedly technical column. For those of you waiting for an agile angle to this, trust me. I'll get there. For those of you happy to read about comic books. Cool! So let's dive in.
There are two main aspects to comic book collecting: collecting as a financial investment and collecting for enjoyment. While there are many people like me who purchase and read comics for enjoyment, I am always amazed at the people who collect comics only for investment purposes. They don't even read the comics they buy. In fact, there is a relatively recent initiative in comic book collecting to "slab" comics. That is, to have their condition professionally graded, then entomb the comic book in a sealed, archive quality plastic sleeve with a certificate indicating the condition. At this point, the comic book becomes, to me at least, a worthless commodity to be sold or traded purely for its perceived value. In other words, its valuable because somebody else is willing to buy something that they also cannot read or enjoy.

Many of these investors spend a boat-load of money buying the new hot book on the shelf. I've seen people purchase hundreds of copies of a single book, thinking that each copy would someday bring them a fortune. It doesn't.
In truth, if you are truly interested in making money on comic books, you should gather up as much money as you possibly can and invest it in a few (or even one) near-perfect copy of an early issue of a well known character like Superman or Batman. If you can afford to purchase and hold onto a copy of Action Comics #1 from June 1938, the first appearance of Superman, you are bound to make money. If you buy 200 copies of anything on the shelf today at $3 to $5 dollars apiece, they will probably bring you 25 cents apiece in a few years, maybe $1 if you are lucky.
But if you collect comic books because you like to read them, and you buy the things you like to read, every once in a while there's a gem that makes it into your collection before it becomes valuable.



So how does this relate to software and agile? I've been working with a group of recent Ph.D. physicists who are interested in moving from academia into commercial software development. While they are extremely bright and have some advanced algorithm programming skills, it's gotten me thinking about how to succeed in the commercial software industry. And as you may have guessed, there's a parallel to comic book collecting and it boils down to this:
You can spend a lot of time chasing after the latest hotness, but in the end, your ability to craft professional-grade software depends on the investment you've made in understanding the fundamentals and your enjoyment of the current state-of-the-art technology.
That's it. Pretty simple.
And now I'm going to run the risk of complicating it by trying to explain it.
First of all, I did not say not to learn the new shiny hotness. Just like with comic book collecting, there will be new technologies that catch your interest, either because they are directly applicable to your work or just because. Go for it. Learn it. Learning new things expands your horizons and gives you new insights into your craft.
But, just as there isn't enough time to read every comic book published each month,  we are long past the days when we can learn every new technology that comes out. You can certainly read about them and play with them at a superficial level, but there isn't enough time in the day to be an expert at everything. And if you try, you won't have the time to learn any of them well. Better to pick the ones that you need for your current projects or that you truly enjoy and learn them thoroughly.
And it's a tough choice, because there are all kinds of cool things out there, ranging from the Internet of Things (IoT) on the edge of our networks to Big Data distributed through our data centers, from iOS and Android native apps to highly available Web services fronted by Angular, React or any number of other web frameworks, from noSQL databases to Raspberry Pi's, and so much more. Oh, and let's not forget the drones!
And while you are learning the cool things, make sure you understand the fundamentals, the things that don't change based on which technology you are using at the moment.
Here's a list of some things I think every commercial software developer should know, agile or not, in no particular order.
  • Conversational UML: The Unified Modeling Language is a standard way to express object-oriented ideas. I've been in too many design discussions with developers who don't know UML who struggle to express their ideas to others. And even if they do, the artifacts they leave behind, e.g. whiteboard drawings, are indecipherable to anyone that comes late to the discussion. With UML, anyone can walk up to a diagram and understand its intent. Now, I'm not suggesting spending huge amounts of time learning all the nuances of UML. That's why I call this conversational UML. Just like any language, you need to know enough to express yourself. The UML is there to facilitate the conversations, not to replace it.

  • Design Patterns: The book "Design Patterns: Elements of Reusable Object-Oriented Software" by Gamma, Helm, Johnson, and Vlissides introduced the concept of design patterns to the world. It is still required reading today. Perhaps one of the single most productive learning experiences I have had as a software professional was absorbing this book over a weekend. If you've written object oriented software, you will recognize these patterns in your own work. Understanding them and being able to name them allows you to write better, more expressive software that can concisely convey the intent of your design through the use of these patterns and their names.

  • The Open-Closed Principle, Dependency Inversion Principle and Dependency injection: OK. This isn't just one thing but they are all related. The Open-Closed principal, which says that you should design things that are open to extension but closed to modification, sounds impossible to achieve but is quite simple if you understand dependency inversion, that the outside system should define the dependencies of an entity not the other way around, which can be implemented with dependency injection. In other words, when you build a class, function, etc., it should not have knowledge of the outside world. Anything external that it needs to function properly should be given to it. I acknowledge that this is very much an object-oriented concept. As I am learning more about functional languages, I'm curious to see if there is an analogous concept.

  • Version Control with Branching and Merging Strategies: Every developer that works in collaboration with others needs a basic understanding of how to use a version control system to manage their code base. Modern tools like Git provide great power in terms of the ability to easily create diverging branches of code and subsequently merge them back together. But the tool by itself doesn't make managing code easier. In fact, it can help you to quickly make quite a mess of things. Understanding concepts like a stable master branch strategy, an unstable master branch strategy and Branch By Abstraction and how these are different from branching as code promotion strategies can make your life much easier.

  • Automated Testing: Automated testing comes in many flavors from low-level unit testing up to large scalability testing, from functional testing to user acceptance testing, from performance testing to integration testing. And these can be done in a variety of ways from after-the-fact testing to the more agile test-driven and behavior-driven development. Knowing how to build robust tests, and knowing which tests not to write, can mean the difference between stable, well constructed software and a real mess of missed deadlines and broken promises.

  • Build Systems: Having the ability to build your software in a single, well-defined, well-controlled environment avoids the "it works on my computer" syndrome. Build systems like Jenkins and TFS not only compile your code but can also deploy and run all of your automated tests. Having a reliable build system is an important step in creating a successful devOps strategy.

  • Deployment Strategies: Having a well thought out deployment strategy for your software is important to ensure its stability in production. I've seen too many companies build their software in place on their production systems. Since they've bootstrapped their way, they have no repeatable process to stand up another system. When their product is successful and they need to replicate it, e.g. for scaling to support more users, they have no mechanism to do this. Understanding how to deploy your software means you can set up multiple identical, or nearly-identical, development, QA and production environments at any time.

  • Memory Management: While many modern languages don't explicitly require you to manage memory directly, it's still important to understand how your software allocates and frees memory. If you haven't learned a lower-level language like C that requires you to allocate and deallocate memory explicitly, then you run the risk of being too cavalier in your trust of garbage collectors and other automated memory management solutions. Any system can have memory leaks if you don't understand what they are doing under the hood.

  • Performance Tuning and Testing: Every developer needs to understand when and how to tune performance. Prematurely optimize and you run the risk of creating unnecessarily poor designs. Don't think about optimization at all and your software may die by a death of a thousand cuts. That is, too many slow implementations scattered throughout your code making it impossible to optimize. Of course, agile practices can help alleviate that issue.

  • Debugging: I'm not just talking about how to use a debugger. I am talking about general techniques to track down defects in your software. Knowing how to debug your code is important for multiple reasons. First, it means that you can track down defects quickly. Second, it informs you on how to best instrument your code to help track down problems while supporting the production application.

  • User-Centered Design: This is a slightly different beast from the topics above. Everyone on a software team, not just the UX person or the developers, should understand the importance, benefits and practices of user-centered design.  I once worked on a large multi-tiered application where one of the developers said, totally seriously, "Let's build the server first and then see what it can do." Umm, no.
Final Thoughts...
So there you have it. Superman, science and software all wrapped up with a neat little bow. I didn't really tell you how to be a software superhero nor did I provide you with an exhaustive list of skills that modern software developers need. But I hope I at least got you thinking about your own skills and how they line up to the list above.

About the Author
Dr. Mark Balbes serves as Vice President, Architecture at WWT Asynchrony Labs, and leads multiple Agile projects for Government and Fortune 500 companies. He received his Ph.D. in Nuclear Physics from Duke University in 1992, then continued his research in nuclear astrophysics at Ohio State University. Dr. Balbes has worked in the industrial sector since 1995 applying his scientific expertise to the disciplines of software development. He has led teams as small as a few software developers to as large as a multi-national Engineering department with development centers in the U.S., Canada, and India. Whether serving as product manager, chief scientist, or chief architect, he provides both technical and thought leadership around Agile development, Agile architecture, and Agile project management principles.
Source: https://adtmag.com/articles/2016/06/14/software-superhero.aspx

Tuesday, January 26, 2016

How to improve tech skills while contributing to open source projects



Although some people think open source projects only need programmers—and experienced ones, at that— open source project needs go beyond the ability to write code. They also require testing, technical support, documentation, marketing, and more. And contributing to projects also is a great way to improve technical skills and connect with people who share similar interests. One barrier to participating in open source projects is not knowing how to join and get started. In this article, I'll explain how to start contributing to an open source project.
Con Kolivas, an Australian anesthesiologist, developed his own task scheduler for the Linux kernel because the one that existed was adapted for servers and did poorly with user tasks. Alexey Kuznetsov, a theoretical physicist, became a Linux hacker and a system programmer. Peter Semiletov, an IT journalist, has been developing his open source text editor, TEA, for a decade. Lesya Novaselskaya, who studied to become an autopsist, now takes part in testing an open source project. There are many more examples like these of individuals united by pursuing their interests in open source projects, while gaining experience and having fun.

Write new code

You don’t have to be an expert to start working on a project. If you know the programming language used in the project, create a new feature and offer it to the project team. Some projects are easier on novices, and others are not. Developers in novice-friendly projects, veterans and otherwise, can help you iron out the code. In any case, if your code can help other people, your contribution won’t go unnoticed.
Each project has specific internal processes with which you need to familiarize yourself before you start contributing. For example, in PostgreSQL, all processes are strictly regulated; changes to the code are sent as patches to all primary developers for a thorough study. Other projects, like Parrot, allow commits to the master branch. If the project employs GitHub, pull requests are probably involved. In other words, remember that no two projects are alike.
Each time you change the code, have in mind that you’re part of a team, and do your best to have your coding style fit the one adopted in the project. The part of the code you add or edit must not stick out from the rest. You may have your own preferences in terms of code styling, but what you commit must follow the common rules. Otherwise, it’s like saying, “I don’t like your style. Mine is better, so do it like I do.”

Prioritize defects

Code is without a doubt the basis of any project; however, writing it is not the only thing you can do to participate. Technical support is often neglected because everyone is focused on adding new features and fixing bugs. But tech support is a great place for a new contributor to start.
For example, OpenVZ has a completely open bug tracker at bugs.openvz.org. The bug tracker collects all known issues—fixed and open—that the nearly decade-old project ever had. A bug tracker is one way of establishing communication between developers and users. Continuous work on current requests provides a great opportunity to contribute. Have in mind that you may need certain access rights provided by a project manager (often given on a meritocratic basis).

Test intermediate versions

Testers interested in working on open source software may have no idea where to start. And most open source projects, commercial or not, typically don't have enough testers. Finding and sorting bugs can save time that developers spend locating issues.
If a user comments something like, “The software doesn’t work when I do these steps,” testers can examine the issue and why it happens, before sending it on to developers. Testers determine whether the problem is reproducible (and what steps are required), and what triggers the behavior in specific environments. Even if you don’t know the actual reason behind a bug, an effort to narrow down the list of possible reasons may greatly help fix it. No matter what details you as a tester manage to find, add them to the bug for everyone to see.
In my experience, open source projects typically lack resources to test new features thoroughly. So before any serious changes are introduced to the master branch, the project attempts to involve as many testers as possible by issuing a call for testing. No project possesses the amount of hardware or software configurations rivaling those available to its entire community. Because of that, OpenBSD and OpenVZ, for example, announce new features and ask for help testing them.
You can help developers test how software works on a different platforms. Your feedback will be all the more valuable if you use some kind of nonstandard hardware. If you confirm that the build works even in such an environment, you make it much easier for the project managers to assess project’s current release state.

Create tests

Most projects use software suites for code testing and those usually allow addition of custom tests. Use tools like LCOV for C to locate parts of the source code, which cannot be checked by preset tests. Then create custom tests to have these parts of code covered, as well.

Fix bugs and add features

A patch with a bug fix or a new feature is a classic way of involving people into an open source project. James Bottomley, CTO of Odin, also recommends fixing bugs and adding features to people who are willing, but do not knowing how to join a Linux project. As an example, he usually cites a case when the functionality he needed from a SIP client on Android was missing, so he created a patch and send it to the SIPdroid project.
When you create new features, adding a test for the code you’ve changed is also good. Some projects require that all bug fixes are accompanied with tests. Take notes while you look into unknown code. Even if you can’t fix the bug, describe what you’ve found out in the ticket. Doing so will help the people who will deal with the bugs after you.

Help maintain project infrastructure

Does DevOps interest you? Good DevOps engineers are hard to find (I can say this from my own experience). A DevOps engineer can improve their skills in projects with open infrastructure development, such as Wikipedia and the Fedora projects. OpenVZ also is moving in this direction. Setting up continuous integration for project components, creating component packages for Linux distributions, and automatic configuration of developer environments are all DevOps tasks.

Write and localize documentation

Maintaining documentation is an important part of any project that is often neglected. Moreover, often documentation is written from a perspective of someone already familiar with the software, instead of that of a new user or novice. Reading such documentation, you might get the feeling that you’re expected to know how the software works already. Often the perspective of a new user finds shortcomings in the current documentation that went unnoticed by project contributors. Besides, documentation in rapidly evolving projects becomes obsolete fast, so it needs to be updated regularly.
Thinking that documentation is unimportant is a mistake. All contributions to an open source project matter. For example, Ingo Schwarze, an OpenBSD developer who also worked at CERN, created mandoc, which is now used to format manual pages not only in OpenBSD, but also in FreeBSD, NetBSD, and DragonFlyBSD. He also sorted out the formatting of existing man pages in the project. (For more details, read his BSDCan 2015 talk (PDF).) So if you’re interested in doing something important for the project, help improve its documentation.

Help community members

For a project to evolve, answering questions, those coming from new users in particular, is crucial. Time spent on this won’t be wasted, even if the answer is in the documentation already. As a result, you could end up with a grateful new, active contributor. Everyone has to start somewhere, and any project needs an inflow of people to advance.

Promote projects

If you have a blog, share stories about your experience in open source projects. Tell your readers about issues you stumbled upon while using open source software and how you solved them. This way you will kill two birds with one stone: You drive attention to the project, and you create a knowledge base for future contributors. A blog describing your technical achievements, research, and expertise is also a great way of sharing actual experience gained while contributing to the project, as well as solutions you found to technical issues (which might be useful if you look for new work opportunities). Many projects employ contributor blog post aggregators, often called planets, including:
Posts from enthusiasts can be interesting to read, even the writer isn't formally contributing to the project.

Create design

Design is where many open source projects fail miserably. Boring websites and bland logos haunt projects, simply because contributors are focused on how the project should work, not also how it should look. So input from designers is welcome. Members of the StackExchange community tried answering questions like, “How can graphic designers contribute to open source projects?” and “How to motivate a graphic designer to join an open source project?,” but their views diverged.

Source: https://opensource.com/life/16/1/open-source-skills

Wednesday, January 6, 2016

Vietnam ICT market

A report about the Vietnam ICT market, published by the Canadian Trade Commissioner Service in March 2012, describes Vietnam as an attractive software outsourcing destination for Canadian companies.  TMA Solutions is listed in the report as one of the largest Vietnam IT outsourcing providers.
Many indexes have shown the Vietnam ICT industry’s dramatic development over recent years.  The improvement is a result of better infrastructure, availability of devices and telecommunications, as well as human resources. While the low-cost advantage is well understood by Canadian companies,  the report also notes that the quality of human resources is high among Vietnam offshore software company. Vietnam software developers are intelligent, good at math, and hard-working.
Two other main reasons discussed in the report that make Vietnam IT outsourcing companies attractive are the strategic location of Vietnam in Southeast Asia and its population size.  These factors have helped attract global ICT and electronics manufacturing giants such as Samsung, Foxconn, Intel, NEC, Canon, and Hitachi, and many others.
One recommendation for Canadian companies who are setting up outsourcing projects with Vietnam IT outsourcing companies is to plan on sending a few talented staff to go overseas for training.  This is a common practice and helps create a more successful project.  Upon returning home, the individuals work with staff to develop their skills and pass on the knowledge 
In such a fast-growing ICT market, TMA Solutions is listed as one of largest Vietnam offshore software companies, with competencies being built around three pillars: telecom, business applications and mobile applications development. With over 18 years of experience in R&D software outsourcing, TMA has been able to win contracts from international customers such as Avaya, IBM, Nortel, Alcatel-Lucent, NTT, Toshiba, Telus, and NEC. The company has offices in Canada, Europe, US, Japan, and Australia, and has been witnessing an impressive growth rate of over 50% through years of operation.




Source: http://www.enterprisecanadanetwork.ca/_uploads/resources/The-Information-and-Communications-Technology-Market-in-Vietnam.pdf

Tags

Recent Post