What I Learned From Workplace Part 1

Technical practice and its limits

In general maturity and cost can influence a technology’s acceptance and popularity. After 2001, I took part in several projects and most of them were built on Java Enterprise Edition (JavaEE), a popular platform for enterprise applications. One reason of this trend was that a large number of developers were creating open-source software with Java technology, which has the following advantage over proprietary software: no license fee, vendor-free and good code quality. Another reason is that there were plenty of Java programmers available at the market. A similar trend happened after 2010, when more companies (including my company) are switching their platform to web-based technologies. The trend started with standardisation of web browser and the popularity of mobile devices.

Regarding professional practice, it is mainly affected by the scale of a project. When I work on a personal application, it is not necessary to carry out any practice. For slightly bigger projects (e.g., a small library or a RESTful API with 5000 lines of source code), a waterfall procedure can help to create a product with higher quality. For big projects (e.g., an online shopping site or a video game with 20000 lines of source code), both design and development should be organised into multiple cycles. Nowadays, two Agile methodologies: extreme programming (XP) and Scrum are widely used to handle projects on this scale. For even bigger projects (e.g., commercial products with sophisticated user interface or operating system), multiple teams should work together just as the project of radiology information system that I joined. Please refer to that project for more information.

Analysis tools

Regarding design technology, I mainly use Unified Modelling Language (UML) to design a system. I use use-case diagrams to scope a project’s functionality, understand high-level requirement and use them as media to discuss with requirement engineers. I use class diagrams to define domain models and use them as media to discuss with architecture team to verify the overall design. I create sequence diagrams for important methods of a class and use them as media to discuss with software engineers. If necessary, I also use state machine diagrams or deployment diagrams for a complicated module. Please refer to my projects for the details.

Regarding middle-ware (or application server) technology, I have professional proficiency in Java and JavaEE including persistent technology (Hibernate, JPA), Enterprise JavaBean, Servlet and Java Messaging Service. Through self-learning and online courses, I have limited working proficiency in Nodejs (a server-side Javascript development platform) and Microsoft .NET Framework.

I have a decent knowledge in database technology, which enables me to design database tables, do database programming and troubleshoot issues in relational database such as Oracle, MySql and SQLServer. Through self-learning, I have elementary knowledge in non-relational database such as MongoDB and Redis.

I have professional proficiency in presentation technology like Java ServerPage, Java Swing and AngularJS. Through self-learning and online courses, I have limited working proficiency in Web technology like HTML and CSS.

I am familiar with Integrated Development Environment (IDE) of Eclipse (Java) and Microsoft Visual Studio (C#). Through self-learning, I have elementary knowledge in Xcode (IOS). I have considerable experience in building developing environment on Windows, Linux and MacOS and have good understand in software packaging tool like Apache Maven (Java) and npm (Javascript) and version control tool like Subversion and Git. Through self-learning, I have elementary knowledge in continuous integration tool Jenkins. I have deep understanding in Test-Driven practice: jUnit (Java), mock, mocha (Javascript).

As a modelling language, UML provides an easy way to communicate with requirement engineers. In my experience, I use class diagrams for middle-sized projects. But it is not as strict and formal as a programming language. As a result, I also use sequence diagrams, pseudo code or prototypes as supplements to verify the feasibility of the design. During development, UML diagrams are served as references. After development, it is developer’s responsibility to synchronise them with source code. An out-dated design could be even worse than no design.

Programming language is the most important tool for software development. Different languages have their own advantages. High-level languages like Java, C# and Javascript have a clear syntax and can be efficient in building programs. For performance-critical applications or applications for the devices with limited resource, we still need to use middle-level languages like C or even assembly language. Apart from general-purpose programming languages, there are other specific languages that are good at certain areas like scientific computation, finance, or gaming. And a programming language with an active community and good support is also important especially for a long-life commercial product. Therefore a programming language should be chosen according to the needs of a project.

Management of materials and resources

Computers can affect developers’ productivity to a large extent. For example, my team needs to compile a large number of source files every day and a slow-speed hard disk will be a bottleneck. After upgrading hard disk to Solid State Disk (SSD), the compiling time is reduced by 20 minutes on average. So rather than waiting for the compiling, developers can use this portion of time to do more creative work. I persuaded the manager to do the upgrading. I used the same strategy to equip every member with dual monitors. I also asked for two exclusive servers for the team (a database and an application server) so that we can work in own way without disturbance from other teams. When the team worked on a web-based application, I asked for the latest iPad to test the compatibility of web browser. Apart from hardware, software is another important resource. I ask the company to pay the licensing fee for an Integrated Development Environment (IDE) so that the team can use the advanced tool to improve our productivity.

Knowledge and specifications up-to-date

Commercial software providers tend to use mature technology with a stable version to build their products. But a software engineer should not limit knowledge for this reason. For example, I pay close attention on Fast Healthcare Interoperable Resource (FHIR) standard, which is the latest version of Health Level Seven International (HL7). Although it is still a draft version, FHIR standard is the next generation and has many advantages over the previous version. It is valuable to follow it so that I can analyse its impact on the current products (connectivity module in radiology information system) and will be able to give a road-map to do the upgrading. Another technology, AngularJS, is the same situation. My team takes responsibility for two mobile applications built with AngularJS version 1.x. The upcoming release of version 2 will be totally different and will not be compatible with the previous version. For this reason, I am self-learning the latest document.

Communication skills and project plan

From 2008 to 2009 when I worked in a cross-site project, Kodak Digital Cinema Service, I needed to write mail to align progress twice a week with my co-workers in US. I also used mail to discuss technical issues or design with my colleagues every day. From 2010 till now, I work in a global project with several development teams worldwide. Apart from mail, I also use text messaging or audio conference to exchange progress and to discuss technical problems. In general, I can choose correct and appropriate words (in English) to express myself clearly.

communicate effectively with both technical and non-technical individuals and audiences
Since 2010, I have given several presentations to developers in R&D department about Test-Driven Development. I introduced the contents with metaphor, slogan and my own experiences to make it easy to understand and encourage the audiences to practise. I hold a regular training session for intern engineers (software development and software testing) about the development of user interface and how to do exception-handling. I use samples from real projects to explain the theory and the underlying reason to help new employees catch up the knowledge gap. Each year, I give several times of formal progress report to management team with PPT or other project management tools (Jira, TeamForge).

Development management and leadership

In recent 6 years, as a Scrum master, I practice Scrum methodology in a development team. I monitor team’s progress on Sprint dashboard on a daily basis. I update team’s progress on team’s Wiki page (later replaced by Jira) and discuss with project managers on risk analysis, blocking issues, resource dependency and scheduling. On the other hand, since human resource is valuable in software engineering. I set up annual target for team member and review their KPI at the end of year to help personal development.

I started my career in 2001. As a software engineer, I always finished my work on time. In 2008, when I worked for Eastman Kodak (Shanghai), I participate in a cross-site project for two years. I worked with a development team in US. I built a good communication with the remote team (via mail) and made my contribution in coding work. In 2011, I undertook the position of team leader and Scrum master in Agfa Healthcare (Shanghai). I work with product owner on Scrum sprint routines, hosting Scrum estimation / review planning, doing code review and providing training sessions for team members, having video / audio conference with other Scrum team to align progress and have technical discussions and help team members set personal development goal and review their performance at the end of year. My team can deliver software product most of time and I get annual reward from the company several times for my contribution in software developing and team management.