Credits: Gsmarena

Credits: Gsmarena

Google promised that the newest developer preview would be available to flash starting this month and Google was sure able to deliver on that promise. And with great timing as well, tomorrow is when the Google Pixel and Pixel XL are officially going on sale in Verizon and Best Buy Stores in the US with Android 7.1 out of the box.

It looks like Google is taking a more hands-on approach with the way it handles updates for its Nexus devices. We’ve never had developer previews this early on, and for an incremental update, nonetheless. It looks like Google is really committed to delivering the quickest updates to its Pixel devices, and the best way to do that, is by ironing out the kinks with the older Nexus crowd.

The Developer Preview is available to flash for the Nexus 6P, Nexus 5X, and the Pixel C.

To install the developer preview, you can do either of three things:

  • You can sign up for the Android Beta program and you’ll be able to download the developer preview OTA.
  • You can download the entire factory image as a TGZ file and flash the image to a phone by using the flast.bat method.
  • You can download the OTA zip file which will bring your device to the latest preview build.

If you have no idea what any of the above methods mean, we suggest that you stick to the first method: enrolling for the Android Beta program and accepting the update over the air. Just remember, if you want to revert to the most recent public software, your data might be wiped in the process.

Credits: Clapway

Credits: Clapway

PHP Developers are great people. They have an open-minded attitude and great conferences for networking. That being said, minorities are underrepresented in the community. So to help shed light on this issue one man went to Kickstarter for a unique idea that will surely make GitHub fans happy. Here are 5 things to know about it.


This rainbow-colored elephant is not just fluffy and cute, but it’s a symbol. A symbol to reflect diversity among the community. Hopefully, it will serve as a reminder not to discriminate based on the race, gender, sexual orientation or anything else in the realm of technology. Furthermore, it’s cuddly. You can’t really argue with that.


Over the last few years, these “Elephants” have become a collectible item. Usually, they’re used to promote conferences, frameworks and even help fund campaigns on Kickstarter. Hence it was just a natural migration to the rainbow elephant to represent diversity. Will they become the next Beanie Babies? That’s up to you.


So how do you promote diversity with this rainbow elephant? After all, money raised on Kickstarter can not be donated to a charitable cause. The secret is the presence of the Elephant. Just having it around the house or office reminds everyone of the diversity issues that exist out there.


If people can dress up as clowns and make a difference, then spreading rainbow elephants everywhere across the world can do the same. The only difference being this is actually for a good cause. Hence, stock up on these colorful animals and get to work. Only you have the power to spread diversity across the globe.


According to the Kickstarter campaign, 1,200 small “Elephants” need to be ordered to meet the minimum order requirements of the factory. It seems like a big number but, considering the size of the developer community, this shouldn’t be a big deal. You hear the cry for help. Hence, it’s your duty to answer it.


Credits: Nordic.businessinsider

Credits: Nordic.businessinsider

Business Insider is the most popular business news site in America. We also run several other popular sites such as Tech Insider; as well as BI Intelligence, a premium subscription service for industry professionals. With a global family of sites across Europe and Asia, we are quickly closing in on a billion page views per month.About the Job:

The role is located in New York City’s Flatiron district. As a backend engineer at Business Insider, your code will reach 100 million readers around the world every month. We face exciting challenges every day due to the demands of our growing audience and the 24/7 news cycle. You’ll report directly to managers who understand technology and even write code. The backend team has many opportunities for a motivated engineer to have a huge impact, and be recognized for it.

About the Engineering Group:

    We do the majority of our server-side development in PHP with MongoDB, Memcached, Symfony, Solr/Lucene, Doctrine, and more. We believe in using the right tool for the job, so we also have a few services written in NodeJS and Python, and a growing number of projects being developed in Go. We use Docker in development and production environments. We are always exploring new tools and ideas as our needs evolve, and we love working alongside people who are willing to try new things. We do daily deployments across many projects. We have dedicated QA and DevOps teams. We do code reviews, write unit tests, and believe in the value of coding standards. We recognize achievement, and promote from within. We encourage collaboration, knowledge sharing, camaraderie and fun. We offer competitive salaries and great benefits.


    Experience with PHP 5 in production applications Proficiency with UNIX commands Experience working with at least one relational or NoSQL database Experience using version control software, preferably Git A solid understanding of OO and MVC design principles, RESTful APIs, caching concepts, the HTTP protocol and general web architecture You write clear and concise code that teammates want to read and build upon Ability to write code that performs at scale You are self starter who takes ownership of your work You are willing to contribute meaningfully when the team is solving hard problems You have genuine enthusiasm and love of programming

Bonus/Nice to Haves:

    Experience with Message Queuing services (SQS, RabbitMQ, IronMQ etc) Contributions to open source projects or personal projects Big Data or Analytics experience Experience with AWS or other Cloud providers Experience with subscription platforms and/or payment processors Any experience with major JS frameworks such as Angular, React etc Experience leading small teams of developers


Credits: Openpr

Credits: Openpr

For a lot decades now, the demand and increase in developing a website has been on the increase. Out of a lot of server side scripting languages, PHP over the years has been an outstanding language to use. PHP as an acronym stands for Hypertext Pre Processor.

The first and foremost advantage of using PHP language is the fact that PHP is an open source server side programming language and is certainly free. Although, it is possible to hire a professional PHP web developer in order to customize your web site as per your company demands, which is really economical. Dependability and better functionality makes PHP the choice of PHP programmers with Clinical SAS Programmer.

Second is the rich flexibility this strong language provides. Nowadays, dynamic websites are in great and increasing demand because of their special characteristics and user friendly features, using PHP programming language while developing a dynamic website gives it better usability and more security. The classes provide by the PHP library makes it flexible in developing a dynamic user friendly websites.

Third is the upper hand that PHP supplies while running multimedia technology. PHP is not dependent on the external plugins to run the applications; the servers execute it and thus needs nothing instead. Also, the recent development over time shows that PHP as a programming language has developed enough to meet various requirements of the clients which were impossible to meet in previous time.

Object Oriented Programming Feature. The object oriented programming feature makes it possible for robust application to be developed. The use of object, classes and methods enables a PHP programmer to develop programs that are easy to run and compile. With the object oriented programming feature, a programmer can modify a code easily to suit a particular purpose.

The above benefits that were mentioned in addition to various other have made PHP popular and most valuable language for developing dynamic sites.

Credits: Techspective

Credits: Techspective

Prevention is better than cure. It’s a saying that’s made us all think about the impact of our current decisions on our future selves. So, we do a little more exercise, eat a little less and try to make small alterations to build a brighter future. It’s the same ethos for those organizations that fail to take software security seriously. Small changes in the short term will save you from catastrophic events in the long term that can easily damage your reputational integrity and put your business at risk of massive financial loss due to regulatory fines, or outright theft.

An sSDLC (secure Software Development Life Cycle) is, therefore, a vital component for your organization’s future health. Like a personal trainer running through your code, it monitors your software to ensure it will run as safely and efficiently as possible without falling into any security potholes such as the high-profile hacking attacks and data breaches that regularly hit the headlines.

In other words, while it’s common practice for many frameworks to perform security-related activities only as part of the testing phases towards the end of the development lifecycle or current sprint, an sSDLC integrates security activities across the lifecycle to help discover and reduce vulnerabilities early on.

The result? Your software is of the highest quality. It looks its best and is fighting fit. Your organization makes security a continuous concern across the development cycle to produce more secure software. Any flaws in the system are detected at an early stage, resulting in cost reductions thanks to swift detection and resolution of issues. Stakeholders are more aware of security considerations and your organization sees an overall reduction of intrinsic business risks.

How does it work?

Whether your current framework uses waterfall, iterative or agile methodologies does not matter. Generally speaking, an sSDLC is set up by adding security-related activities to your existing development process. Such activities include the implementation of scanning tools to ensure your software adheres to the rules of your sSDLC. According to application security solution provider Checkmarx, while it’s important to tailor your sSDLC to your organization, there are four basic steps to facilitate secure software development and to get your sSDLC scans up and running:

1. Build an easy-to-understand and transparent process

You must engage with your development teams at an early stage of the sSDLC deployment process so they understand exactly what to do when conducting a scan. For example, when and what should they scan within their code? And what are next steps if the scan results reveal vulnerabilities? Clear online documentation is a must. You should provide a collaborative platform where developers can communicate with your security teams to share and access information, ask questions and search for advice during these early days, and into the future.

2. Gradually deploy scans to the UIs

Don’t migrate every developer over to your sSDLC scanning system in one go. Gradually implement scan capabilities to a handful of teams, taking your time to ensure each individual team is comfortable with the new scanning systems before moving onto the next team’s implementation. This will help your organization to understand the impact of your sSDLC scanning system on processes, people and the current development landscape, allowing you to correct any teething problems before it’s launched across the entire business.

3. Educate your developers

Train your developers to ensure they understand any vulnerabilities exposed by a scan and how to deal with them. Make sure they understand the associated tools and how to interpret the scan results. For example, if a scan detects a major issues, your developers must understand that the build needs to stop to prevent vulnerable software entering the production environment. This training could be done with a series of workshops, online courses, one-on-one training or a combination of these methods.

4. Handpick some training advocates

Train a squad of trainers so that every development team has at least one member with the knowledge and experience to train other users. These sSDLC advocates can then support their individual teams, as well as run scans and review the results.

These four steps will set your organization off on the right foot for a healthy future with an sSDLC. As with any new regime, it takes time to change bad habits for good habits, but a transparent and iterative approach, backed with a healthy dose of training, will ensure the future wellbeing of your organization.

Credits: Dzone

Credits: Dzone


It is the responsibility of data professionals to protect business data. Changes to the structure and coding of software that is essential to organizational operations must be executed with little downtime or data loss. Consequently, database administrators work tirelessly to prevent system crashes and data failures. However, the risk of failure in deployment, while possibly minimized, can still exist.

Release management tends to anticipate positive results. However, real world technology at times brings about undesirable results when the release doesn’t go precisely as anticipated or planned. When you have tested software changes to the database before confirming changes into the system, and you have test automation integration, QA has performed analytics with refined testing metrics, and scripts have been tested in staging against a copy of the database, red error messages still may cascade down your testing screen, indicating a crash and burn of your hard work and concentrated efforts. What do you do now?

What are the options for getting back on track when operations respond to software releases with system crashes? Do you use a backup to restore system functions? Do you idealize the system with abstractions then switch back to the real-world issue? Do you execute a software rollback to revert the deficiencies while preserving the database?

One way to carry on with software functionalities is to fix or patch specific software issues and execute another release. However, fixing the software only addresses the application deficiencies. Software fixes do not approach the possibilities of system or interface errors.

Therefore, when things go awry, software rollbacks are the all-inclusive manner of return to a point before the act-up occurred. Rollbacks return the software database to a previous operational state.

To maintain database integrity, rollbacks are performed when system operations become erroneous. In worst case scenarios, rollback strategies are used for recovery when the structure crashes. A clean copy of the database is reinstated to a state of consistency and operational stability.

The transaction log, or history of computer actions, is one way to utilize the rollback feature. Another is to rollback through multi-version currency control, an instantaneous method of concurrently restoring all databases.

At times rollbacks are cascading, meaning a failed transaction causes many to fail. All transactions which the failed transaction supports must also be rollbacked. Practical database recovery strategies avert cascading rollbacks. Enterprise, development, and QA departments therefore consistently seek to devise the best strategies for software rollbacks.

Best practice strategies are to avert the need for software rollbacks through incremental and automated testing within development and QA environments. However, even with iterative testing, software and system failures do happen.

A Sound Release Management Plan

Sound development, testing, deployment focused on the end user, and system performance are the fundamentals of release management. The release management team of developers, quality assurance teams, and IT system administrators perform activities geared towards successfully completing deployment of software applications. Release management teams must ensure that there is a plan to smoothly recover from deployment calamities. Planning mechanisms focused on documented rollback procedures that effectively enable recovery from deficiencies in deployment.

  • Develop a policy for software versioning. Assign singular version names, singular numbers, or singular digital logic states to each version. Differentiate test versions from release versions with internal version and released version numbering.
  • Test new versions in a simulated production environment. Simulations go far in tying down anticipated functionalities into near-actual performance over time. Modeling the system reveals the key behaviors or functions of physical or abstract processes. The purpose is to demonstrate how processes will respond to real world input, interfaces, stresses, and system commands.
  • Use a build server which extracts data exclusively from the repository. Data in this way is both traceable and reproducible and reduces the risk of code that is outdated and includes undocumented updates. When new coding is checked into the repository, the build server bundles the revised version within the software development environment. In addition, the build server allows deployment of bundles within different environments. Build servers also allow deployment to be executed with a single command.
  • Maintain the configuration management database. To sustain IT installations of data information technology warehouse assets and intellectual properties, as well as data interactions, the configuration management database must be consistently managed and updated.
  • Possibly add an abstraction layer to isolate certain functionalities and thereby separate the concerns of a computer program into distinct sections. The use of abstraction layers in this manner enhances system independence and the ability of a system to operate with other products or systems without restrictions.

Build Servers Over Backups

Backups require sizable computer resources with uncertain success. Backups themselves and backup recoveries are slow and tedious. Backup strategies are also inconsistently verified with source code fundamentals and reliability, as well as with raw data. Recovery with backups mean that there’s a longer user-restricted mode to prevent data from being added. Rollbacks require running transaction log backups in conjunction with recovery rather than quicker and more reliable rollbacks from a build server repository. The delays in recovery with transaction log rollbacks only increase as the size of the database increases.

Automated scripts can be created with build servers, while with transaction log backups, scripts must be manually created and tested. Rollback scripts are some of the most difficult aspects of application development and deployment to create and maintain, especially when data is updated. Maintaining rollback scripts with structural data updates will likely require complex data migration scripts. Finally, when errors are discovered during the release and new transactions are in place, backup rollbacks will cause the loss of data. Rollbacks from build server repositories providing automated updates are much more reliable for system recovery.

More on Abstraction Layers

Branching by abstraction to gradually change a software system to allow releases which are concurrent with changes is a fairly common coding practice. However, the method of introducing change to a system through the use of abstraction layers for the purpose of enabling supporting services to concurrently undergo substantial changes has not always been universally recognized as a rollback facilitator.

Abstraction occurs without requiring changes to front-end coding unless desired. The built-in background database abstraction layer of stored procedures can work on top of the underlying system architecture to accommodate additional parameters (such as version numbers or flags within the rollback routine) to fulfill coding commands while both new and old software versions continue to function. Updates to the structure and the abstraction layer that support structural change allow you to introduce new coding alterations while leaving existing code untouched. Abstraction layers not only smooth deployment but also simplify rollbacks. With abstraction layers, rollbacks merely need to consider how the code path relates to the original functionality, which abstraction layers have left in place.

Abstraction layers do however require a thorough, and preferably automated, test procedure to prevent errors when older code travels through newer abstraction paths. Fundamental database functionalities are retained, requiring consideration of original coding stability.

Blue/Green Deployment

Blue/Green deployments are automated. Automating deployment reduces system resistance and delays. Automated deployments implement Continuous Delivery and Continuous Integration with no downtime and very little risk. From two copies of the database, Blue/Green deployments deploy to one final copy. With two copies in Blue mode, if one copy does not deploy well, there is the option to switch to the second copy, retaining all data. Once you have validated that deployment is fully implemented the application can be switched in Green mode to the database.

Blue/Green deployments simplify rollbacks in that the old database and old coding are never accessed. Even when transactions have occurred after release, immediate switchbacks to the old system can occur, avoiding the restore process or the need for rollback scripts. One of the safest and most efficient deployment and rollback mechanisms are Blue/Green deployments.

Figment Engine

A Blue/Green deployment, however, requires a database that is small enough for two copies of the database to be accommodated on one server. In addition, reliable synchronization or reliable data migration creation and maintenance are required to sync data between databases.

An inherent issue with database deployment is retaining data when failures occur. Combining rollback strategies with Blue/Green deployment can further reduce the risk of failed deployment, as well as better ensure complete and efficient rollback recoveries. Combining strategies allows for more agility and flexibility for stable deployment or required rollbacks.

Rollbacks and the Enterprise

Enterprise requirements for cost efficiency and ROI dictate that software and system business functions are reliable. The length of time required for rollbacks necessarily becomes an enterprise issue. Processing scenarios dealing with database updates, rollbacks, and recompiles are extremely efficient in avoiding and reducing the time required for rollbacks.

Decentralized development even further dictates that the deployment pipeline be standardized per enterprise priorities. Transparency in process and performance, as well as collaboration and enterprise test management, are crucial to communication with management concerns. Diffused independent responsibilities, rather than centralized protocol, place reporting responsibilities and further obligations on developers, QA, and IT administrators to continuously collaborate with business management and stakeholders.

Rollback procedures must be executed within organizational boundaries with a discreet and defensive stance towards possibilities of risk. The process of rollbacks and recovery are direct in process and results. Rollback operators, therefore, bear responsibility for directly communicating processes and collaborating on enterprise priorities in relation to executions. To assure that the rollback process only positively impacts business priorities, thorough and consistent collaboration is imperative between operational concerns and enterprise priorities.

Theoretical or abstract considerations can commonly be overlooked as important for communication to management. However, theoretical rollback considerations can change the import or direction of deployment outcomes, which can pivot the objective away from business goals and priorities. Reliable messaging and reporting, as well as face-to-face collaboration, is crucial within rollback activities.

The spectrum of rollback protocols in free and specialized domains can breathe new life into the stability of software and system interfaces. Efficient rollback strategies reduce costs to the enterprise, enhance deployment time to market, and engage customer loyalty through efficient operations.

Ücretsiz Japon sansürsüz porno videoları online izleyin

Uzun zamandır diğer ırkların ve kültürlerin porno filmleri ile ilgileniyor muydunuz? O zaman hoş geldiniz! Japonların hayal gücünün bir sınırı yoktur. Herkes japon sikişinin özelliklerini öğrenmeli.
Japon porno kategorisinde, yükselen güneşin porno koleksiyonunun en iyi filmleri toplandı ve inan bana, herkesi şaşırtacak bir şeyleri var.
Asyalıların küçük amcıklara sahip olduğu efsanesine rağmen, genç bayanlarını, sadece elleri ve oyuncakları ile orgazm getirmeyi başardılar.
Asyalılar, dünyanın en çekici kadınlarından biri olarak kabul edilir. Küçük vücutları ve egzotik görünümleri farklı ırklardan insanları heyecanlandırıyor.
Porno lobisi sitemiz, dünyanın en sıcak kızlarının saygınlığını gösterdiği ve sex yaptığı japon pornolarını izlemeyi teklif ediyor.
Uzun yıllar boyunca japonlar, sikişme becerilerini geliştirdiler ve bugün dünyaca ünlü porno yıldızları çıkarır hale geldiler.
Burada, ücretsiz japon porno izleyerek zevk almak kolaydır. Genç ve olgun japon kızlar, dar amcıklarını siktirirken tatlı bir şekilde zevkle inliyorlar.
Porno lobisi sitemizin bedava videoları, bu tatlı sapkınların kullandığı tüm ipuçlarını değerlendirmeyi mümkün kılıyor.
Bu kadar kaliteli bir japon porno videoları, porno sitemizde ücretsiz olarak her ziyaretçi için izlenmeye açıktır.

Burada sitemizin en acılı kategorisindesiniz

Hepsini değil, sadece en kaliteli anal pornoları izleyeceksiniz. İşte iyi HD kalitesinde en iyi seks kayıtları olan anal porno videolar.
Erkekler harika sitemizde anal porno videolar izlemeye bayılıyor. Anal porno konusunda pornografik bir video koleksiyonu topladık.
Kızların delikleri açısından herhangi bir kısıtlaması yoksa sex çok güzeldir, göt deliğinde sikişmek istersin, ağzında ister ve amcıkta istersen hepsi zevk verici olmaktadır.
Anal seks çoğu erkek tarafından tercih edilir, götten sikişin muazzam bir zevk getirmesinin bir çok nedeni vardır, her erkek önce hükmetmek ister. İkinci sebep ise daracık olmasıdır.
En güçlü seks sevenler için online bedava anal porno videolar. Bazen bu pornolar korkutucu görünmek için bile çok acımasız olabilmektedir.
Burada herkes için uygun bir anal porno bulmaya çalışıyoruz. Götten sikişlerle ilgileniyorsanız, porno filmler izleyin ve iyi kalitede eğlenin.
Anal pornolar, ziyaretçilerimiz arasında popüler hobilerden biri olarak kabul edilir. Anal pornolara adanmış en iyi sitelerden birini bulduğunuz için şanslısınız.
Burada her zaman anal sikiş videolarını ücretsiz olarak izleyebilirsiniz. Size keyifli görüntüleme ve kaliteli memnuniyet diliyorum.

Brazzers porno yıldızlarının heyecan verici güzelliği

Birçok porno izleyicisi düşük standartları olan pornoları izlemekten bıktı. Gerçek izleyicilerin iyi bir porno izleme hayatına ihtiyacı var!
Brazzers’ın porno yıldızları hepinize iyi bir şans verecek, çünkü pornografik yetenekleri brazzers pornosu izleyen her erkeği memnun edecek.
Sitemizde, herhangi bir zamanda onun veya herhangi bir brazzers porno yıldızının 720p olarak katıldığı porno videolara başvurabilir ve genellikle kirli grup sikiş denilen şeyi görebilirsiniz.
Kendra Lust, İşini zevkle yapmayı gerçekten bilen gerçek bir porno yıldızıdır. Her zaman sikişebilir, her zaman daha büyük yarağı alana kadar daha fazlasını ister.
Ava Addams, gerçek bir sert sikiş aşığı. Herhangi bir sapkınlık olacaksa o brazzers grup porno filminde mutlaka ava addams olmaktadır.
Mia Malkova, baştan çıkarıcı sarışın porno yıldızı tutkuyla ilgili her şeyi bilir, bu yüzden hem yumuşak hem de sert seks yapmayı sever. Ne kadar sikiştiği önemli değil, her zaman büyüleyici güzelliğiyle baştan çıkarır.
Porno yıldızlarını çalışırken görmek istiyorsanız, ücretsiz brazzers porno filmleri izlemek veya indirmek için favori ve ileri tercihlerinizi seçin!

Sadece güzel xnxx pornoları aç ve izlemekten zevk al

Dünyadaki neredeyse tüm pornoların oldukça iyi olduğunu düşünüyorsanız, tek bir anlamı var. Bu kategoride dikkatlice topladığımız en güzel xnxx pornolarını görmelisiniz.
Burada her şey izleyicinin istediği gibi gerçekten mükemmel. Güzel xnxx pornosu, porno yıldızları hakkında gördüğümüz büyüleyici sikişleri size gösterecektir.
Sitemiz kötü pornolarla ilgili paylaşım yapmadığından, bedava kaliteli xnxx porno filmlerini neden bizimle birlikte izlemeniz gerektiğini kesinlikle anlamanıza yardımcı olacak birkaç avantaj sunuyoruz.
Günün her saati her şey ücretsizdir ve porno izlemenin sınırı yoktur. Ayrıca, istediğiniz herhangi bir xnxx pornoyu indirebilirsiniz, böylece İnternet bağlantısı olmasa bile her zaman parmaklarınızın ucunda olacaktır.
Günlük olarak yeni pornolar eklediğimiz hd porno film sitemizde her gün aynı pornoları izlemenize gerek yok, çünkü tüm kategorilere yeni içerik ekliyoruz.
Bizimle güzel kızlarla efsanevi xnxx porno sitesinden aldığımız pornoları izle ve arkadaşlarınızla paylaşmayı unutma!

Credits: Tgdaily

Credits: Tgdaily

Embedded software systems are usually built into a certain hardware system, and are aimed at the performance of specific functions that help to run a business process successfully and efficiently. Almost every modern device, that is capable of performing a variety of functions, usually come with an efficient embedded software system – hence their helpful and smooth processing nature.

The proper development and up gradation of such a software system is vital for all businesses and organizations, especially the ones who want to walk on a path of success by beating all competition. Finding a software company that comes with experience and reputation in providing high end embedded software solutions, so as to guarantee proper, prompt and efficient service. Today we will take a look at how you can choose the finest embedded software system development solutions. Read on to find out more.

You need to find a software development team that is both flexible and experienced, especially one which has a creative nature and can customize its service based on your needs and specifications. A team with a proper outlook of the future and an inherent ability to innovate based on certain situations occurring in a company are perfect for business organizations who want a software solution that remains in existence for several years. The complications of an embedded software system are directly proportional to the complications of the business world in today’s day and age; hence the team should be able to handle such complications with ease so as to achieve all preset targets.

Industries like the consumer products industry, automotive sector, telecom and wireless industries, multimedia and medical sectors can benefit greatly from an efficient and smooth-functioning embedded software system. Hence, a team that has dealt with almost all of these sectors, and comes with great references and past reviews, should be your first choice.

When any business organization chooses a software development team that adheres to every Safety standardpreset by governing authorities in terms of embedded software system development, they also need to ascertain if the team knows the entire developmental structure. The team should be thorough in its approach, and attentive towards the client’s needs, and should also provide adequate and efficient after sales service and support to all clients.

Why we emphasise on the team’s developmental capabilities is quite simple. This very step can be extremely complicated, and hence requires a lot of attention. There are a few steps that the team needs to take care of to facilitate proper development. They are:

  • Customers requiring thorough analysis
  • Proper architectural design of the software
  • Efficient systems engineering
  • Proper debugging and porting
  • Proper optimization and testing
  • Regular maintenance

Once all these phases are taken care of, the developmental phase becomes a whole lot easy to comply with.

Hence – it is quite simple. When you choose a service provider or a team that deals with embedded software systems, always consider the experience, the capability and the skill set of the team before making a final choice.

Credits: Infoq

Credits: Infoq

On completing a computer science degree, a large proportion of graduates proceed into industrial jobs in software development. They work in teams inside organisations large and small to produce software that is central to business and in many ways underpins the daily lives of everyone in the developed world.

Many degree programmes provide students with a solid grounding in the theoretical basis of computing, but it is difficult in a university environment to provide training in the types of software engineering techniques and practices that are used in industrial development projects. We often hear how there is a skills shortage in the software industry, and about the apparent gap between what people are taught in university and the “real world”. In this article we will explain how we at Imperial College London have developed a programme that aims to bridge this gap, providing students with relevant skills for industrial software engineering careers. We will also describe how we have tried to focus the course around the tools, techniques and concerns that feature in the everyday life of a professional developer working in a modern team.

Classes in universities are almost always taught by academic researchers, but few academics have personal experience of developing software in an industrial environment. While many academics, particularly computer scientists, do write software as part of their research work, the way in which these development projects are carried out is normally not representative of the way that projects are run in industrial settings. Researchers predominantly work on fairly small software projects that act as prototypes or proofs-of-concept to demonstrate research ideas. As such they do not have the pressures of developing robust software to address a mass market. They may concentrate on adding new features required to further their research, paying less attention to robustness or maintainability. Similarly they do not typically have a large population of users to support, or need support the operation of a system that runs 24/7, as the developers of an online retailer, financial services organisation or telecoms company might.

Academics and postgraduate researchers often work on their own, and so often do not have experience of planning and managing the work of many different contributors to a software project, integrating all of these whilst preserving an overall architecture which supports maintainability, and making regular releases to a customer according to an agreed schedule. Because of this, few academics have occasion to develop practical experience of the project management and quality assurance methods prevalent in modern industrial software development.

Our approach to tackling these issues has been to engage members of the industrial software engineering community to aid in teaching our software engineering curriculum, drawing on their practical experience to guide the content and the delivery of its constituent courses. This has ranged from getting individual pieces of advice on current issues, helping to outline course content, having practitioners come in to give guest lectures or coaching, to – in my own case – joining the staff. We have found that practitioners are generally very happy to help us shape the curriculum for the next generation of software engineers, to give something back to the community, and of course helping with teaching can also be an opportunity to promote their companies if they are recruiting.

Course Content

At Imperial we have a three or four year programme in Computing. Students can study three years for a BEng degree, or study an extra fourth year and receive an MEng degree. The first three years are fundamentally the same for both programmes, but those going on to take the fourth year also do a six month work placement with a company between their third and fourth years. Here we will describe the core modules that we feel constitute the “software engineering” element of the course – although alongside these, students study modules in mathematics, logic, compilers, operating systems and many other aspects of what might be thought of as “computer science”.

First Year

In the first year of the degree programme, we concentrate on basic programming skills. We believe that these are fundamental for all of our students, and these are taught through lecture courses in functional, object-oriented and systems programming, supported by integrated computer-based laboratory exercises. The lab exercises are very important, as it is through these that students get to practise programming, get personalised feedback, and improve.

One problem that we have is that some students come to university with lots of coding experience, sometimes from school, but mostly from self-study and projects undertaken in their own time. Others come never having written a line of code in their lives. We need to support both of these groups in our introductory course – not making the inexperienced coders feel like they are disadvantaged, whilst not boring the more experienced students with material they already know. The main thing we have done to try to level the playing field is to start by teaching Haskell as the first language. This is usually equally unfamiliar to almost all of the new students – even those who have programmed a lot typically have not used this type of language before.

One innovation that has proved very successful is introducing the use of version control right from the very first week. Rather than being “a tool for collaborative projects” used later on, we have made it so that every lab exercise involves cloning a starting point from a git repository, making incremental commits, and then what the students submit for assessment is a git commit hash pointing to the version that they want marked. This makes use of version control something that is completely natural and an everyday activity.

Second Year

In their second year, we aim to teach students how to design and develop larger systems. We want to move on from teaching programming in a particular language, and to look at larger design concerns. In an earlier iteration of this course, the material concentrated on notation, specification languages and catalogues of design patterns. This meant that students would know a range of ways to document and communicate software designs, which were not tied to a particular implementation language. However, when comparing this course content with the design practices predominantly used in industrial projects, we found some mismatches.

Formal specification techniques are used by engineers developing safety-critical and high-precision systems, but these make up only small proportion of industrial teams. Many more are working on doubtless important – but not safety-critical – systems that support business in different types of enterprise, consumer web services, apps and games etc. The use of formal specification techniques amongst these sorts of teams is relatively rare. Also, as agile development methods are now common, design is no longer considered a separate phase of the project, to be completed before coding commences – rather it is a continuous process of decision making and change as the software evolves over many iterations. There are still design concerns at play, but rather than needing a way to specify a software design abstractly up-front, the common case is that team members need ways to discuss and evaluate design ideas when considering how to make changes and add new features to an existing piece of software.

We still give students the vocabulary of design patterns and architectural styles, but with each we look at the problem it is aiming to solve (for example the removal of duplication) and any trade-offs that may apply (for example introduction of coupling caused by the use of inheritance, and how this might affect future changes). We have moved towards grounding the examples in code, accompanied by tests, and cast design changes as evolutions and refactorings affecting various qualities of the codebase that we are working on. By working concretely with code, we have found that students engage more directly with different design concerns, and the effects of the forces as play in the system, than they did when thinking about designs more abstractly. We can use modern IDEs to manipulate code into different structures, use metrics to talk explicitly about code quality, complexity, coupling etc, and the students can learn kinaesthetically by working through problems and producing practical solutions.

Third Year

In their third year, students have a major assignment to work on a project in a group of 5-6, over a period of about 3 months (in parallel with their lecture courses). Each group has a different brief, but all are aiming to build a piece of software that solves a particular problem or provides a certain service for their users. Each group has a customer – either a member of the faculty, or an industrial partner, to guide the product direction. The main aims of this project from an educational point of view are to build the students’ skills in teamwork and collaboration, and to put into practice software engineering techniques that support this kind of development work. To support this, we run in parallel a course on Software Engineering Practice, covering development methods, tools, quality assurance, project and product management techniques, etc.

This has been one of the most difficult courses for us to get right. The main problem is one of relevance. We want the software engineering course to support the group projects, and for the two to be integrated. But, feedback from the students has often been that they felt that the software engineering course was a distraction, and that they would prefer to spend time “just getting on with the project”. This shows that students were not feeling the benefits of the taught software engineering practices in their own projects. We considered two possible reasons for this.

Firstly, the range of projects being carried out by different groups is wide. Some may be developing mobile apps, while others create web applications, desktop software or even command line tools. If we include material in the curriculum about a particular topic that is relevant to some project groups – for example cloud deployment – it may be irrelevant to others. The more content we try to include in the course, the greater the chance that we are asking students to spend time learning a topic that they feel does not affect their project.

The second reason that we think students are not feeling the benefit of taught software engineering practices is that even though these projects are by no means trivial, they are not big or long enough to really feel the pain of maintaining software over a long period of time, integrating many different aspects. We encourage them to set up collaboration tools and procedures to help them work together both in terms of technical code and software management, and also more general project management. At the beginning of the project, these can seem like overhead – especially the time spent setting up tools, which again can seem like time lost from “getting on with the project”. It is only towards the end of the projects, when pressure is on to deliver, that these tools and techniques return rewards on that investment.

Fourth Year

The final part of our four year programme is a course entitled Software Engineering for Industry. The main philosophy behind it has been to give students a view of some of the issues facing industrial software engineers, essentially preparing them for the world of work. As we have iterated on the second and third year courses, we have tried to include more and more industry-relevant content, and this has often meant moving material down from the fourth year course. For example some material on test-driven development that we used to cover in the fourth year is now a core part of the second year, and an introduction to agile methods is now done in the third year to support group projects. While we do not want to be jumping on all the passing trends, this advanced course gives us a vehicle to discuss and distill the current state of practice, and to filter things down into lower years once they become core practices.

One of the main topics that we aim to cover in this course is working effectively with legacy code. A large proportion of practising software engineers spend their working lives making changes to existing codebases, rather than starting from scratch. This is not a bad thing, it is normal. Successful systems evolve and need to be updated as new requirements come in, market conditions change, or other new systems need to be integrated. This is not second class work, but engineers need techniques to work in this way which differ from what they might do if they had free reign to start from a blank slate. When might it be more appropriate to refactor, and when to rewrite?

Such topics are the realm of opinion rather than hard fact. Thus one of our aims in this course is for students to develop their critical thinking, and to voice their own opinions and arguments based on reading around each topic presented. The main part of their week’s work is to research the topic through blogs, articles, papers, videos of conference talks etc and to write a short position statement based on this answering one of the discussion questions. Then we have a discussion class where students briefly present and discuss their findings from their week’s work. To add to the industrial viewpoint, each week we invite a “panel” of industrial experts as guests. We elicit the panel’s views on the topic under discussion, and they bring their own stories, examples and case studies to share. As we develop the course, it feels less like we are delivering content, and more designing an experience through which the students can participate and learn for themselves.

Perspectives on Teaching

Not all material is taught in the same way, and we are continually trying to improve the learning experience. One way that helped to think and talk about this was to consider the different ways that students learn in terms of three perspectives described by Mark Guzdial in his recent book Learner-Centred Design on Computing Education. Guzdial characterises different learning experiences as Transmission – the transferral of knowledge through a one-way medium like a lecture, Apprenticeship – where students focus on developing skills by practising them in exercises, and Developmental – where each student gets individual help with the things that will help them personally to advance, not necessarily aligned with the rest of the class.

In teaching software engineering, we still have quite a lot of transmission (even though there is evidence [] that it is not so effective, tradition is hard to overcome), but we are starting to focus more on apprenticeship models and the deliberate practice of skills, particularly in terms of software development. It is hard to give students frequent one-to-one attention with class sizes of 150 students, and relatively few tutors, but as we encourage more group work and particularly pair programming in student assignments, we find that students are able to coach and learn from each other, getting individual developmental help from their peers. Prof Laurie Williams at NCSU has done a lot of work showing the effectiveness of pairing programming in teaching. []

Making the Learning Experience More Effective

As we strive to improve the content that we teach, and the way that we teach it, a useful approach has been to think about the delivery of ideas as a value stream. If we start with a big list of requirements for what students should learn (a syllabus) and then over the course of a few months, transmit them via lectures, and at the end perform some quality assurance on this learning by giving the students an exam, then we have something that feels very much like a waterfall development process. In software development, the industry has evolved to value fast feedback and frequent delivery of value in small batches. Can we work towards the same goals in iterating on our learning experiences?

One thing we have done along this path is introducing weekly, small assignments, rather than big end-of-term assessments. This encourages students to work at a more sustainable pace across the term, and gives them and their tutors feedback on how well they have understood each concept. For example, in our software design module, we aim to have a targeted practical exercise each week, so that students can practise a particular aspect of design by writing code and tests, and get feedback on their work within a few days. Of course this generates a large load on the tutors to mark and return a large number of assignments in a short cycle. It is tempting to relent, and reduce it to fortnightly, or monthly assignments, but again following the principles we would apply in an agile project, we have tried to use automation to give initial feedback early, and make the work of the human marker easier, so that it can be done more often. We are not there yet, and there is still a lot of work for the tutors to do each week to give good quality feedback, but it feels like we are heading in the right direction.

We still have lots of problems to solve, and the constantly changing state of the software industry means that we will have to constantly update our curriculum to stay relevant, balancing computer science fundamentals (which hopefully do not change that often) with industrial trends and the application of modern tools and techniques. But, as we would if we were running a software project, we hope to continue to inspect and adapt and continuously improve.