Continuous integration with Hudson

Continuous integration has become common practice for teams focused on ensuring code quality throughout the software development lifecycle. In this article, Nicholas Whitehead introduces Hudson, a popular open source CI server.

Continuous integration (CI) is a set of practices intended to ease and stabilize the process of creating software builds. CI assists development teams with the following challenges:

  • Software build automation: With CI, you can launch the build process of a software artifact at the push of a button, on a predefined schedule, or in response to a specified event. If you want to build a software artifact from source, your build process is not bound to a specific IDE, computer, or person.
  • Continuous automated build verification: A CI system can be configured to constantly execute builds as new or modified source code is checked in. This means that while a team of software developers periodically checks in new or modified code, the CI system continuously verifies that the build is not being broken by the new code. This reduces the need for developers to check with each other on changes to interdependent components.
  • Continuous automated build testing: An extension of build verification, this process ensures that new or modified code does not cause a suite of predefined tests on the built artifacts to fail. In both build verification and testing, failures can trigger notifications to interested parties, indicating that a build or some tests have failed.
  • Post-build procedure automation: The build lifecycle of a software artifact may also require additional tasks that can be automated once build verification and testing are complete, such as generating documentation, packaging the software, and deploying the artifacts to a running environment or to a software repository. In this way artifacts can quickly be made available to users.

To implement a CI server you need, at minimum, an accessible source code repository (and the source code in it), a set of build scripts and procedures, and a suite of tests to execute against the built artifacts. Figure 1 outlines the basic structure of a CI system.

http://www.javaworld.com/javaworld/jw-12-2008/images/CIOverview.jpg

Figure 1. Basic structure of a CI system

The system components come into play in the following sequence:

  1. Developers check new and modified code into the source code repository.
  2. The CI server creates a dedicated workspace for each project. When a new build is requested or scheduled, the source is retrieved from the repository into this workspace, where the build is then executed.
  3. The CI server executes the build process on the newly created or refreshed workspace.
  4. Once the build completes, the CI server can optionally invoke the defined test suite on the new artifacts. If the build fails, registered individuals can be notified by email, instant messaging, or some other method.
  5. If the build is successful, the artifacts are packaged and transmitted to a deployment target (such as an application server) and/or stored as a new versioned artifact in a software repository. This repository can be part of the CI server, or could be an external repository, such as a file server or a software distribution site like Java.net or SourceForge. The source code repository and the artifact repository can be separate, and it is actually possible to use some CI servers without any formal source control system at all.
  6. CI servers usually have some sort of console where projects can be configured and debugged, and where requests can be issued for operations such as ad hoc immediate builds, report generation, or retrieval of built artifacts.

Hudson is a free and open source product hosted at Java.net It was originally written by Kohsuke Kawaguchi, a staff engineer at Sun Microsystems, who announced its release on his blog in February of 2005. Hudson has since had approximately 154 releases.

Here are some of the reasons why I like Hudson, and why I would recommend it to you, barring any unusual requirements:

  • Of all the CI products I've used, it is by far the easiest to install and configure.
  • Its Web-based user interfaces are very friendly, intuitive, and responsive, in many cases providing immediate Ajax-enabled feedback on individual configuration fields.
  • Hudson is Java-based (which is useful if you're a Java developer) but is not limited to building Java-based software.
  • Hudson is cleanly componentized and offers a well-defined and documented extensibility API in the form of Hudson plugins. This has in turn led to a large library of Hudson plugins that extend the functionality of the server; these are freely available and installable from the Hudson console.
Resources:
- Get the latest Hudson WAR file here or here.
- Download apache-tomcat-6.0.18.exe to install Tomcat on your Windows machine. Download JBoss 4.2.3.GA for a Linux environment (look for the file named jboss-4.2.3.GA.zip).
- If your Hudson server cannot connect to outside resources, you can download the plugins you need from the Hudson Website.

Update your Resume!

What you say? You like your job? Have no intention of leaving? Why would I update my resume?

Well, I too enjoy my job and the company I work for. I’m not talking about finding a new job, I’m talking about managing your career. In this day and age, individuals need to take responsibility for career management.

A good time to review your resume is once a year, around review time. I know not all companies do yearly reviews. Maybe the review you get is not as valuable as it could be. Regardless, set up your own time to review your career progress.

From now on, update it so it reflects your current experiences. Take a good look at the what you have done in the past year. How have you progressed over the last couple years?

Next, set up some goals for yourself in the next year. I like to focus on four general areas:

Technology: What technologies should I make improvements on? What new technologies are coming up? How can I better use current technologies?

Processes: Learn about new agile methods? Learn about how others are using the methods and improving them. Learn a process you may be less familiar with like configuration management techniques.

People skills: Don’t forget the soft skills. I’m not necessarily talking management here (unless that is your goal). Leadership can come from anywhere. Unless you are a “one programmer team” you work with others. Whenever you are attempting to influence someone, you are using leadership skills.

Business: We don’t work in a vacuum. What business is my company in? What areas of that business can I get a greater understanding?

Once you have a list of general topics you want to focus on, make then concrete. Pick enough that pushes you to grow in the next year, but not more then you can effectively commit to.

Next, make each goal measurable. Write down something that you can do in the next year. Write the goal such that it is obvious when you done.

Put a date with the goal. If the goal has multiple parts, put dates to the sub goals as well. For example:

Technology goal: Attain a greater understanding in .NET framework.

  • Read the book by
  • Choose an application in which to use your new skills by
  • etc…

People skills goal: Improve communication skills.

  • Choose a topic you can present on by
  • Prepare a presentation by
  • Learn foreign languages: Japanese ...
  • Present to your peers at a lunch-n-learn by
  • etc..

Next year, you can review the goals you accomplished and add them to your resume.

These goals don’t all have to be specific to the company you work for. It makes sense that they are so you can improve your career opportunities there. However, add some personal goals as well. I might want to learn a new language like Groovy or Python even though my company is a primarily a Microsoft shop or learn the.NET framework if your company is a Java shop.

You have to take charge of your career. Your company may or may not take an active role in this. Like many things in life, if you don’t manage it, it will most certainly manage you.

What It Takes To Be A Great Technical Lead

Most teams have some kind of technical lead in place. They’re often referred to as the ‘dev lead’, or the ‘lead developer’ or the ‘lead programmer’ or whatever. Some people are great fits for this role, and some simply aren’t. Below is my list of what i think makes for a great technical lead. Note: i’m not claiming that i live up to all of this, although i do try to.

  • You obviously need strong technical skills. You are responsible for the final result, so you better make sure that there is a solid technical foundation for the team to build upon. This doesn’t mean that you should build this foundation entirely yourself. Preferably, you involve your teammates into this as much as possible. You’re also responsible for fixing technical issues that your teammates can’t solve. You either fix it, or when that’s not possible you should figure out an acceptable workaround. Be sure that your teammates are fully aware of the details of the solution or the workaround.

  • You have to be able to teach your teammates. As a technical lead it is your duty to improve the skills of your teammates. No matter how good you may be, if you can’t transfer that knowledge and those skills, you’re not doing a good job as a technical lead. If there are some core principles or practices that you want them to apply to their work, you need to make sure that each and every one of them really ‘gets’ it. You need to be willing to invest the time and effort it takes to achieve that.

  • You need to trust your teammates. This isn’t always easy, especially when it’s about someone who hasn’t progressed as far or as fast as you would’ve liked him to. But it is definitely necessary. If a teammate realizes that you trust him, he will usually respond with improved output. It might not always be everything you hoped for… but either his effort, or the quality of the work will improve. Keep trusting the teammate, and eventually both will improve. Which actually happens a lot sooner than most people would think.

  • Stimulate self-organization. I know a lot of people don’t believe in self organizing teams. And to an extent, that disbelief is somewhat valid. There always has to be one or a couple of people who have some kind of leadership role (be it officially or not). Those leadership roles do not prevent self organizing teams though, in fact, i’d say they enable them. Do not simply assign tasks to your teammates all the time. Organize planning meetings where members can choose the tasks they will do. Make sure there is always some kind of balance though. You really need to prevent that person A always gets the shitty tasks or that person B always get the funnest tasks. Mix it around it a little and try to make sure that the fun/shit ratio is never out of whack.

  • Don’t keep the coolest technical tasks for yourself. If the project requires some kind of technical research to use a new library or to figure out an approach to a new problem or whatever, make sure all of the teammates get the chance to do these kind of things once in a while. It’s not always possible to do so, but when you can, it really pays off. Morale goes up, trust goes up in both directions, and everybody improves.

  • Try to prevent overtime as much as possible. If you’ve been given an impossible deadline, try to convince management that it’s simply not doable. Fight for it if you must. But realistically speaking, you can’t extend every deadline they throw at you, and sooner or later you’re gonna be in a situation where you and your teammates are going to have to put in some overtime to get everything done on time. Don’t tell your teammates they have to do it. Ask them if they want to do it. For some people, this doesn’t always make a difference but for others, it makes a huge difference. And this one is very important when you’re doing overtime: do not go home early while your teammates are still working, because it will come back to bite you in the ass eventually.

  • Remember that you are responsible for the final result. If something goes wrong, it really is your fault. Never put the blame on one of your teammates. Not within the team, and definitely not when managers are present. If a teammate screwed up and the problem made it into the production version, then that is your responsibility and your fault.

  • Give credit where credit is due. If a teammate did a great job with something, give them that credit and make sure everyone else knows about it too, especially management. Never take credit for the work of a teammate because that is simply one of the lowest possible things you could do.

  • Finally, you need to realize that your teammates are not your developers. I’ve often heard technical leads say things like “yeah, my developers…” or “my guys … “. No. They are your teammates, no matter what your role in the team is. Having a leadership role does not mean you are the boss of your teammates or that you can boss them around. If anything, it destroys morale and the results of your team will suffer tremendously from it.

Resources: Davy Brion

Android Development Flow

This diagram shows how Java source code, XML files, and other resources are compiled and packaged into an Android package file. The resulting .apk file is actually a JAR file, you can see its content by typing jar -tvf MyApp.apk.

  • The yellow rounded rectangles are Android SDK tools
  • The orange boxes are files created by the programmer
  • The remaining white boxes are generated by the tools
Resources: Eric M. Burke

15 Tools to Help You Develop Faster Web Pages

Response times, availability, and stability are vital factors to bear in mind when creating and maintaining a web application. If you’re concerned about your web pages’ speed or want to make sure you’re in tip-top shape before starting or launching a project, here’s a few useful, free tools to help you create and sustain high-performance web applications.

I’ve tried to include a wide variety of tools that are easy to use, and have tried to keep them as OS and technology-independent as possible so that everyone can find a tool or two.

1. YSlow for Firebug

YSlow for Firebug - Screenshot

YSlow grades a website’s performance based on the best practices for high performance web sites on the Yahoo! Developer Network. Each rule is given a letter grade (A through F) stating how you rank on certain aspects of front-end performance. It’s a simple tool for finding things you can work on such as reducing the number of HTTP request a web page makes, and compressing external JavaScript and CSS files. A worthwhile read is the Ajax performance analysis post on IBM developerWorks that outlines practical ways of using YSlow in your web applications.

2. Firebug

Firebug - Screen shot

Firebug is an essential browser-based web development tool for debugging, testing, and analyzing web pages. It has a powerful set of utilities to help you understand and dissect what’s going on. One of the many notable features is the Net (network”) tab where you can inspect HTML, CSS, XHR, JS components.

3. Fiddler 2

Fiddler 2 - Screen shot

Fiddler 2 is a browser-based HTTP debugging tool that helps you analyze incoming and outgoing traffic. It’s highly customizable and has countless of reporting and debugging features. Be sure to read the “Fiddler PowerToy - Part 2: HTTP Performance” guide on the MSDN which discusses functional uses of Fiddler including how to improve “first-visit” performance (i.e. unprimed cache), analyzing HTTP response headers, creating custom flags for potential performance problems and more.

4. Cuzillion

Cuzillion - Screen shot

Cuzillion is a cool tool to help you see how page components interact with each other. The goal here is to help you quickly rapidly check, test, and modify web pages before you finalize the structure. It can give you clues on potential trouble-spots or points of improvements. Cuzillion was created by Steve Saunders, the ex-Chief Performance at Yahoo!, a leading engineer for the development of Yahoo’s performance best practices, and creator of YSlow.

5. mon.itor.us

mon.itor.us - Screen shot

monitor.us is a free web-based service that grants you a suite of tools for monitoring performance, availability, and traffic statistics. You can establish your website’s response time and set up alerts for when a service becomes unavailable. You can also set-up weekly, automated benchmarks to see if changes you’ve made impact speed and performance either positively or negatively.

6. IBM Page Detailer

IBM Page Detailer - Screen shot

The IBM Page Detailer is a straightforward tool for letting you visualize web components as they’re being downloaded. It latches onto your browser, so all you have to do is navigate to the desired site with the IBM Page Detailer open. Clicking on a web page component opens a window with the relevant details associated with it. Whenever an event occurs (such as a script being executed), the tool opens a window with information about the processes.

7. Httperf

Httperf is an open-source tool for measuring HTTP server performance running on Linux. It’s an effective tool for benchmarking and creating workload simulations to see if you can handle high-level traffic and still maintain stability. You can also use it to figure out the maximum capacity of your server, gradually increasing the number of requests you make to test its threshold.

8. Pylot

Pylot - Screen shot

Pylot is an open-source performance and scalability testing tool. It uses HTTP load tests so that you can plan, benchmark, analyze and tweak performance. Pylot requires that you have Python installed on the server - but you don’t need to know the language, you use XML to create your testing scenarios.

9. PushToTest TestMaker

PushToTest TestMaker - Screen shot

PushToTest TestMaker is a free, open-source platform for testing scalability and performance of applications. It has an intuitive graphical user interface with visual reporting and analytical tools. It has a Resource Monitor feature to help you see CPU, memory, and network utilization during testing. The reporting features let you generate graphs or export data into a spreadsheet application for record-keeping or further statistics analysis.

10. Wbox HTTP testing tool

Wbox HTTP testing tool - Screen shot

Wbox is a simple, free HTTP testing software released under the GPL (v2). It supports Linux, Windows, and MacOS X systems. It works by making sequential requests at desired intervals for stress-testing. It has an HTTP compression command so that you can analyze data about your server’s file compression. If you’ve just set up a virtual domain, Wbox HTTP testing tool also comes with a command for you to test if everything’s in order before deployment.

11. WebLOAD

WebLOAD - Screen shot

WebLOAD is an open-source, professional grade stress/load testing suite for web applications. WebLOAD allows testers to perform scripts for load testing using JavaScript. It can gather live data for monitoring, recording, and analysis purposes, using client-side data to analyze performance. It’s not just a performance tool – it comes with authoring and debugging features built in.

12. DBMonster

DBMonster - Code Screen shot

DBMonster is an open-source application to help you tune database structures and table indexes, as well as conduct tests to determine performance under high database load. It’ll help you see how well your database/s will scale by using automated generation of test data. It supports many databases such as MySQL, PostgreSQL, Oracle, MSSQL and (probably) any database that supports the JDBC driver.

13. OctaGate SiteTimer

OctaGate SiteTimer - Screen shot

The OctaGate SiteTimer is a simple utility for determining the time it takes to download everything on a web page. It gives you a visualization of the duration of each state during the download process (initial request, connection, start of download, and end of download).

14. Web Page Analyzer

Web Page Analyzer - Screen shot

The Web Page Analyzer is an extremely simple, web-based test to help you gain information on web page performance. It gives you data about the total number of HTTP requests, total page weight, your objects’ sizes, and more. It tries to estimate the download time of your web page on different internet connections and it also enumerates each page object for you. At the end, it provides you with an analysis and recommendation of the web page tested – use your own judgment in interpreting the information.

15. Site-Perf.com

Site-Perf.com - Screen shot

Site-Perf.com is a free web-based service that gives you information about your site’s loading speed. With Site-Perf.com’s tool, you get real-time capturing of data. It can help you spot bottlenecks, find page errors, gather server data, and more - all without having to install an application or register for an account.

More Tools and Related Resources

If you have a favorite web performance tool that wasn’t on the list, share it in the comments. Would also like to hear your experiences, tips, suggestions, and resources you use.

Resources: sixrevisions.com

N-Tier Application Development with .NET

Bug tracking tools

Here is a compilation of defect tracking products

Plus:

See also:

Generating reports on projects checked into Subversion repositories.

StatSVN retrieves information from a Subversion repository and generates various reports describing the project development, e.g. timeline for the lines of code, contribution of each programmer etc. The current version of StatSVN creates a static set of HTML documents containing tables and chart images. StatSVN is open source software.

See a Sample Html Report

Visit StatsSVN Wiki

Download StatSVN from SourceForge

sdedit - Quick Sequence Diagram Editor

My coworker pointed me to this tool and I found it very useful.
Quick Sequence Diagram Editor is a tool for creating UML sequence diagrams from textual descriptions of objects and messages that follow a very easy syntax.


Below you may see a syntax example for Sequence Diagram shown in screenshot - it's very intuitive and easy to understand.

user:Actor
/order:Order
db:TicketDB
acc:Account

user:order.new()
order:return=db.reserve(date,count)
db:return=acc.debit(cost)
acc:return=db.bonus(date,count)
user:order.destroy

The tool supports actors, constructors, destructors, threads and on-diagram comments that can be used to represent conditions or loops.
Diagrams can be exported in PNG format.

image

Download sdedit

Please choose a file named "sdedit-light_no_export_library.exe" to run the sdedit on a Windows Platform. The exe file is wrapped around a Java archive (you still need Java 5 or higher).)

SharpForge-Open source .Net 2.0 project management web application

SharpForge is an open source, .Net 2.0 project management web application. It's similar to SourceForge or CodePlex but for your own team or organization. It is available for you to download it and host anywhere you want or need to.

Features include

* Multi Portal
* Multi Project
* Subversion Administration
* Work Item Tracking
* Project Forums
* Release Management
* Subversion Wiki
* Browse Source Code
* News Feed Aggregation

Try SharpForge out

Three Free Tools Any Web Developer Must Use

Hey all

Here are some great tools that will help you diagnose problems and errors on your applications. Don’t leave home without them!

SQL Profiler

SQL Profiler

We all know that most problems start in the DataBase. SQL profiler will help you to locate excessive unnecessary DataBase access and long inefficient Queries. The tool itself comes with the installation of SQL server. Here is the MSDN article about how to use SQL Profiler

Fiddler

Fiddler HTTP Debugger

This baby is the best! Definitely one of my favorites. Fiddler is an Http Debugger where you can track and analyze all the Get and Post requests in many aspects such as Content, Timing and many more. Here is an MSDN article about how to use Fiddler. Download Fiddler here.

I Highly recommend using it. It can be a life saver sometime.

WCAT Tool

WCAT Load Testing

How will you know if your WebSite can handle the load?

WCAT to the rescue. WCAT will quickly allow you to simulate a fake massive load on you WebSite and provide you with statistics regarding the performance of your web application.

Check out this great WCAT tutorial by Alik Levines which explains how to use it and where to get it from.

Reference: Dev102

A Great Visual Studio Add-on You Must Have

Recently I found out this great add-on for Visual Studio 2008 called PowerCommands. PowerCommands Extends the functionality of Visual Studio 2008 by adding some features which we all want built into Visual Studio. PowerCommands provides the following:

  • My favorite: Copy Reference, very useful indeed, and you all know it, just right click on the reference you want copied and select copy reference, now go to the another project and just paste that reference
    PowerCommands Copy Reference
    * you can copy all the references by right clicking on references.

  • Another useful option is Collapse Projects, click on the solution and collapse all the projects at ounce. Very handy if you have a project loaded solution.
    PowerCommands Collapse Projects

  • Email Code Snippet, I don’t know about how useful is it, but its cool :).
    PowerCommands Email Code Snippet

There is much more inside so just download PowerCommands here and find out all the other enhancements.

References: dev102

7 Open Source Version Control Systems Reviewed

This article reviews some of the top open-source version control systems and tools that make setting up a version control system easy.

CVS

CVS is the grandfather of revision control systems. It was first released in 1986, and Google Code still hosts the original Usenet post announcing CVS. CVS is the de facto standard and is installed virtually everywhere. However, the code base isn’t as fully featured as SVN or other solutions.

The learning curve isn’t too steep for CVS, and it’s a very simple system for making sure files and revisions are kept up to date. While CVS may be an older technology, it’s still quite useful for any designer or developer for backing up and sharing files.

Tortoise CVS is a great client for CVS on Windows, and there are many different IDEs, such as Xcode (Mac), Eclipse, NetBeans and Emacs, that use CVS.

CVS Resources

SVN

Subversion is probably the version control system with the widest adoption. Most open-source projects use Subversion as a repository because other larger projects, such as SourceForge, Apache, Python, Ruby and many others, use it as well. Google Code uses Subversion exclusively to distribute code.

Because of Subversion’s popularity, many different Subversion clients are available. If you’re a Windows user, Tortoise SVN is a great file browser for viewing, editing and modifying your Subversion code base. If you’re on a Mac, Versions is an elegant client that provides a “pleasant way to work with Subversion.” Xcode is Apple’s developer environment and Subversion client that ships with Leopard on a Mac.

SVN Resources

Git

Git is the new fast-rising star of version control systems. Initially developed by Linux kernel creator Linus Torvalds, Git has recently taken the Web development community by storm. Git offers a much different type of version control in that it’s a distributed version control system. With a distributed version control system, there isn’t one centralized code base to pull the code from. Different branches hold different parts of the code. Other version control systems, such as SVN and CVS, use centralized version control, meaning that only one master copy of the software is used.

Git prides itself on being a fast and efficient system, and many major open-source projects use Git to power their repositories; projects like:

GitHub has recently helped establish Git as a great version control system, providing a beautiful front end for many large projects, such as Rails and Prototype. However, Git isn’t as easy to pick up as CVS or SVN, so it’s much harder to use for a beginner.

Git Resources

Mercurial

Mercurial is another open-source distributed version control system, like Git. Mercurial was designed for larger projects, most likely outside the scope of designers and independent Web developers. That doesn’t mean that small development teams can’t or shouldn’t use it. Mercurial is extremely fast, and the creators built the software with performance as the most important feature. The name “mercurial” is an adjective that means “Relating to or having characteristics (eloquence, swiftness, cleverness) attributed to the god Mercury.”

Aside from being very fast and scalable, Mercurial is a much simpler system than Git, which is why it appeals to some developers. There aren’t as many functions to learn, and the functions are similar to those in other CVS systems. It also comes equipped with a stand-alone Web interface and extensive documentation on understanding Mercurial if you have been using another system.

Resources for Mercurial

Bazaar

Bazaar is yet another distributed version control system, like Mercurial and Git, that offers a very friendly user experience. It calls itself “Version control for human beings.” It supports many different types of workflows, from solo to centralized to decentralized, with many variations in between.

One of the main features of Bazaar is the fine-grained control you’ll have over the setup. As shown with the workflows, you can use it to fit almost any scenario of users and setups. This is a great revision control system for nearly any project because it’s so easy to modify. It’s also embeddable, so you can add it to existing projects.

Bazaar also has a strong community that maintains things like plug-ins and lots of third-party tools, such as GUI software to add a graphical interface to the system.

Bazaar resources:

LibreSource

LibreSource is a Web portal used to manage collaborative projects. It’s based on Java/J2EE and is more a set of visual collaborative tools to help facilitate projects and teams. While the other systems discussed so far have been designed more on a “command line” level, LibreSource is centered more on tools that don’t have a big learning curve.

It has built-in features such as Wiki pages, forums, trackers, Synchronizers, Subversion repositories, files, download areas, drop boxes, forms, instant messaging and more. Think of LibreSource as a collaboration hub for project development.

LibreSource is perfect for the developer or designer who doesn’t want to learn lots of technical jargon and wants to focus more on communication with the project’s members. Just install the package and start collaborating, without facing much of a learning curve.

Resources for LibreSource

Monotone

Monotone is the baby of the distributed revision control bunch. While many of Monotone’s peers focus on performance, Monotone places higher value on integrity than performance. In fact, it can take quite a bit of time for a new user of Monotone to simply download the initial repository due to the extensive validation and authentication required.

Monotone is fairly easy to learn if you’re familiar with CVS systems, and it can import previous CVS projects. However, it’s not quite as popular as other version control systems.

Monotone Resources

Version Control Tools

  • QCT GUI commit tool
    A version control commit tool that supports Mercurial, Bazaar, Cogito (Git), Subversion, Monotone, and CVS.
  • Meld is a merge and diff tool that allows you to compare two or three files and edit them in place, while updating automatically. It works with CVS, Subversion, Bazaar and Mercurial.
  • Push Me Pull You is another GUI for distributed version control systems. It works with Mercurial, Git, Bazaar and Darcs.

Version Control Resources

Referencea: smashingmagazine

Your Move MOBLIN DEVELOPER CHALLENGE

Những điểm nhấn trong cuộc thi

Đây chính là một cơ hội để xây dựng tương lai của Moblin. Các bạn sẽ có cơ hội để thoả thích sáng tạo những ứng dụng dành cho lĩnh vực giải trí và truyền thông vốn đang tạo nên sự phát triển mã nguồn mở dựa trên những thiết bị MID sử dụng hệ điều hành Linux. Bạn hãy truy cập vào trang web sau đây http://moblin.org/projectss.php để xem danh sách các loại ứng dụng đã có sẵn và những ứng dụng cần đựơc tạo ra. Những thí sinh phải nộp một bảng khái niệm về ứng dụng của mình trong đó các bạn phải giải thích và đưa ra cảm nhận về ứng dụng mà mình sáng tạo, giải thích lý do vì sao bạn cho rằng ứng dụng của bạn là thú vị đồng thời mô tả hoạt động của nó. Nhớ là đính kèm thêm những bức hình hay jpegs về ứng dụng của bạn một khi nó phát triển.

Từ ngày 10/09/2008 đến ngày 8/11/2008, các thí sinh sẽ phải nộp bảng khái niệm mô tả ứng dụng mà bạn làm ra. Vui lòng xem qua trang web www.moblin.org để biết thêm chi tiết về quy trình nộp thiết kế của bạn. Vòng sơ khảo (vòng đầu tiên) sẽ do Cộng đồng Mobin bình chọn ra top 10 ứng dụng hay nhất. Bất kỳ ai đăng ký đều có thể bình chọn những khái niệm ứng dụng được yêu thích nhất. Top 10 thí sinh thắng cuộc sẽ nhận đựơc USD 1000 và một chiếc máy MID để các thí sinh có thể sử dụng chiếc máy này phát triển bảng beta ứng dụng của mình. 10 thí sinh thắng cuộc trên cũng sẽ có được một chuyến tham quan ở Singapore (Do Tập đoàn Yahoo tài trợ). Những thí sinh thắng cuộc sẽ nhận được giải thưởng khi họ chấp nhận thi tiếp vòng chung kết và nộp bản ứng dụng beta chạy trên cád máy MID.

10 thí sinh thắng cuộc do cộng đồng bình chọn tiếp tục xây dựng, phát triển khái niệm của họ thành bản Beta (bản thử nghiệm). Hạn chót nộp bản thử nghiệm Beta là ngày 30/01/2009. Khâu đánh giá, tuyển chọn sẽ do những người am hiểu về công nghệ thông tin và mã nguồn mở trong nước phụ trách. Vào ngày 16/02/2009 sẽ công bố người đoạt giải nhất (đoạt giải vô địch) chọn ra từ 10 thí sinh thắng cuộc.

Những ứng dụng tham gia cuộc thi “Tốc độ của bạn” phải chạy trên chiếc máy MID và có khả năng xây dựng phát triển dựa trên Moblin.

Quy trình đánh giá

Việc đánh giá dựa trên các tiêu chí sau : tính độc đáo, tính thẩm mỹ, cách thức sử dụng, yếu tố hấp dẫn, lôi cuốn người sử dụng. Cộng đồng sẽ bình chọn, và quyết định top 10 khái niệm mô tả ứng dụng được yêu thích. Thời gian bắt đầu bình chọn vào ngày 10/09/2008 và kết thúc bình chọn vào ngày 12/11/2008. Ngày 15/11/2008 sẽ ông bố Top 10 thí sinh được thắng cuộc tại @ Moblin.org.

Ngày 16/02/2009 những chuyên gia về IT trong nước sẽ chọn ra người giành giải vô địch từ 10 thí sinh trên.


Giải thưởng

Người đoạt giải vô địch (giải cao nhất) sẽ nhận được vé khứ hồi đi du lịch tới bất cứ nơi đâu trên thế giới để tham dự một sự kiện mã Nguồn Mở, bao gồm 1 tuần với đầy đủ tiện nghi.

10 người thắng cuộc được bầu chọn từ cộng đồng bỏ phiếu sẽ nhận được 1000 USD và một thiết bị di động vào ngày 30/11/2008. Những thí sinh trên được phép nhận giải thưởng khi họ đồng ý thi tiếp vòng chung kết và đồng ý nộp bản thử nghiệm beta ứng dụng của họ.

Automatically identifies design problem in software with JDeodorant

JDeodorant is an Eclipse plug-in that identifies and resolves design problems in software, known as bad smells.

It can automatically identify bad smells such as Feature Envy and Type Checking.

- Feature Envy indicates that a method seems more interested in a class other than the one it actually is in.

- Type Checking is that all typed software entities should still have the same type after the refactoring, this issue often meets in Polymorphism, State/Strategy pattern.

With JDeodorant, it helps us to automatically detect those smells.

Resources:

- http://java.uom.gr/~jdeodorant/

- http://www.tabdee.ltd.uk/Software/Papers/Refactoring/Refactoring.html

Some sample analysis in sample Java project:

30 Skills Every IT Person Needs

In this article: Can you call yourself an accomplished information technology employee? Find out by reading about the 30 IT skills you should have.

I noticed an article called "75 skills every man should master." It included some skills I have and some I don't. For example, I can tie a knot and hammer a nail, but frankly I can't recite a poem from memory, and bow ties still confuse me.

It was an interesting read and made me realize I could be more well-rounded than I am. To be honest, we all could be.

So in the spirit of personal growth, I developed a list of skills every IT person should have.

1. Be able to fix basic PC issues. These can be how to map a printer, back up files, or add a network card. You don't need to be an expert and understand how to overclock a CPU or hack the registry, but if you work in IT, people expect you to be able to do some things.

[ If you have IT staffers who aren't up to snuff, fire them. Learn how to do it right. ]

2. Work the help desk. Everyone, from the CIO to the senior architect, should be able to sit down at the help desk and answer the phones. Not only will you gain a new appreciation for the folks on the phones, but you will also teach them more about your process and avoid escalations in the future.

3. Do public speaking. At least once, you should present a topic to your peers. It can be as simple as a five-minute tutorial on how IM works, but being able to explain something and being comfortable enough to talk in front of a crowd is a skill you need to have. If you are nervous, partner with someone who is good at it, or do a roundtable. This way, if you get flustered, someone is there to cover for you.

4. Train someone. The best way to learn is to teach.

5. Listen more than you speak. I very rarely say something I didn't already know, but I often hear other people say things and think, "Darn, I wish I knew that last week."

6. Know basic networking. Whether you are a network engineer, a help desk technician, a business analyst, or a system administrator, you need to understand how networks work and simple troubleshooting. You should understand DNS and how to check it, as well as how to ping and trace-route machines.

7. Know basic system administration. Understand file permissions, access levels, and why machines talk to the domain controllers. You don't need to be an expert, but knowing the basics will avoid many headaches down the road.

8. Know how to take a network trace. Everyone in IT should be able to fire up wireshark, netmon, snoop, or some basic network capturing tool. You don't need to understand everything in it, but you should be able to capture it to send to a network engineer to examine.

9. Know the difference between latency and bandwidth. Latency is the amount of time to get a packet back and forth; bandwidth is the maximum amount of data a link can carry. They are related, but different. A link with high-bandwidth utilization can cause latency to go higher, but if the link isn't full, adding more bandwidth can't reduce latency.

10. Script. Everyone should be able to throw a script together to get quick results. That doesn't mean you're a programmer. Real programmers put in error messages, look for abnormal behavior, and document. You don't need to do that, but you should be able to put something together to remove lines, send e-mail, or copy files.

11. Back up. Before you do anything, for your own sake, back it up.

12. Test backups. If you haven't tested restoring it, it isn't really there. Trust me.

13. Document. None of the rest of us wants to have to figure out what you did. Write it down and put it in a location everyone can find. Even if it's obvious what you did or why you did it, write it down.

14. Read "The Cuckoo's Egg." I don't get a cut from Cliff Stoll (the author), but this is probably the best security book there is -- not because it is so technical, but because it isn't.

15. Work all night on a team project. No one likes to do this, but it's part of IT. Working through a hell project that requires an all-nighter to resolve stinks, but it builds very useful camaraderie by the time it is done.

16. Run cable. It looks easy, but it isn't. Plus, you will understand why installing a new server doesn't really take five minutes -- unless, of course, you just plug in both ends and let the cable fall all over the place. Don't do that -- do it right. Label all the cables (yes, both ends), and dress them nice and neat. This will save time when there's a problem because you'll be able to see what goes where.

17. You should know some energy rules of thumb. For example: A device consuming 3.5kW of electricity requires a ton of cooling to compensate for the heat. And I really do mean a ton, not merely "a lot." Note that 3.5kW is roughly what 15 to 20 fairly new 1U and 2U servers consume. One ton of cooling requires three 10-inch-round ducts to handle the air; 30 tons of air requires a duct measuring 80 by 20 inches. Thirty tons of air is a considerable amount.

18. Manage at least one project. This way, the next time the project manager asks you for a status, you'll understand why. Ideally, you will have already sent the status report because you knew it would be asked for.

19. Understand operating costs versus capital projects. Operating costs are the costs to run the business. Capital equipment is made of assets that can have their cost spread over a time period -- say, 36 months. Operating costs are sometimes better, sometimes worse. Know which one is better -- it can make a difference between a yes and no.

20. Learn the business processes. Being able to spot improvements in the way the business is run is a great technique for gaining points. You don't need to use fancy tools; just asking a few questions and using common sense will serve you well.

21. Don't be afraid to debate something you know is wrong. But also know when to stop arguing. It's a fine line between having a good idea and being a pain in the ass.

22. If you have to go to your boss with a problem, make sure you have at least one solution.

23. There is no such thing as a dumb question, so ask it ... once. Then write down the answer so that you don't have to ask it again. If you ask the same person the same question more than twice, you're an idiot (in their eyes).

24. Even if it takes you twice as long to figure something out on your own versus asking someone else, take the time to do it yourself. You'll remember it longer. If it takes more than twice as long, ask.

25. Learn how to speak without using acronyms.

26. IT managers: Listen to your people. They know more than you. If not, get rid of them and hire smarter people. If you think you are the smartest one, resign.

27. IT managers: If you know the answer, ask the right questions for someone else to get the solution; don't just give the answer. This is hard when you know what will bring the system back up quickly and everyone in the company is waiting for it, but it will pay off in the long run. After all, you won't always be available.

28. IT managers: The first time someone does something wrong, it's not a mistake -- it's a learning experience. The next time, though, give them hell. And remember: Every day is a chance for an employee to learn something else. Make sure they learn something valuable versus learning there's a better job out there.

29. IT managers: Always give people more work than you think they can handle. People will say you are unrealistic, but everyone needs something to complain about anyway, so make it easy. Plus, there's nothing worse than looking at the clock at 2 p.m. and thinking, "I've got nothing to do, but can't leave." This way, your employees won't have that dilemma.

30. IT managers: Square pegs go in square holes. If someone works well in a team but not so effectively on their own, keep them as part of a team.

© IDG 2007

Bốn tiêu chí khi áp dụng design pattern

Nghe mấy ông prồ thỉnh thoảng bắn một câu kiểu như "cậu muốn tiến xa trong cái nghiệp lập trình này thì phải rành design patterns". Thì đúng thế, ai chả biết. Design pattern vốn là tinh hoa của những người đi trước, đúc kết lại mà thành. Nhưng động vào thì ôi thôi, nhiều quá, biết rẽ lối nào đây?

Design Patterns: Elements of Reusable Object-Oriented Software là bí kíp vỡ lòng gối đầu giường của bất kì ai muốn theo học design pattern. Học đạo cần biết tên biết mặt sư tổ sư thúc sư huynh. Chính 4 sư tổ (the Gang of Four) của design pattern đã viết bí kíp này: Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides.

Bí kíp nêu và miêu tả kĩ 23 chiêu. Như nhan đề bí kíp, những chiêu này dùng cho phong cách hướng đối tượng. Học đạo là học cái tinh thần, cái cốt lõi, sao cho dạt tới cảnh giới vô chiêu thắng hữu chiêu. Ai chưa thấm nhuần ý nghĩa của "vô chiêu", xin đọc (lại?) các siêu phẩm của Kim Dung hoặc bài nghiên cứu của Nguyễn Duy Chính. Nắm được tinh thần của design pattern rồi, thì hoàn toàn áp dụng được 23 chiêu trên vào những ngôn ngữ không hướng đối tượng, như C chẳng hạn.

23 chiêu vẫn chỉ là chiêu. Có thể tóm tắt tinh thần chúng lại thành 4 tiêu chí có quan hệ mật thiết với nhau:

  • Refactor
  • Lập trình cho interface hơn là implementation
  • Nên dùng composition hơn là inheritance
  • Delegate

Phần dưới bàn về 4 tiêu chí này. Design pattern là một phần của software engineering. Ai nghĩ bàn về software engineering mà không dính tí mã nào là kì khôi, thì thật sai lầm. Bởi vì về bản chất, software engineering không dạy cú pháp ngôn ngữ, mà dạy tinh thần (<- đã bảo là "đạo" mà lị).

Refactor

Hãy nhớ lại các bài toán đặt làm nhân tử chung ở cấp 1, cấp 2. Refactor nghĩa là tìm những cái giống nhau đặt riêng ra ngoài.

Dấu hiệu cho thấy có thể refactor, là khi cứ phải cắt dán cả một khối mã. Để đỡ phải cắt dán trong cùng một chương trình, người ta nghĩ ra hàm hoặc class. Để đỡ phải cắt dán từ chương trình này sang chương trình kia, người ta nghĩ ra framework.

Chương trình có hàng chục chỗ cần vẽ tiêu đề cửa sổ, mà chỗ nào cũng phải dùng đến 10 dòng mới vẽ xong, thì sao không gom 10 dòng đó thành một hàm, lúc nào muốn vẽ chỉ cần 1 dòng gọi hàm?

Nếu vin cớ rằng project gấp quá không có thời gian refactor, thì nên bỏ việc lập trình vì nó không phù hợp với bạn. Làm phần mềm khó chứ không dễ, không phải thằng dở hơi có bản tính chụp giựt nào cũng tự dưng thành công. Mất có 1 tiếng để refactor mà lợi được cả nhiều ngày tháng sau mà còn không làm, thì bạn còn phải thức khuya dài dài để làm cho xong project.

Nếu vin cớ rằng xong project rồi hẵng refactor, thì quả là ngụy biện. Vì xong project rồi thì refactor để làm gì nữa? Bạn còn hứng thú để ngồi mò mẫm refactor nữa không? Những thư viện và framework có ý nghĩa thực tế đều là những thứ được sinh ra từ những project thực tế. Thư viện và framework do giáo sư tiến sĩ ngồi chơi xơi nước nghĩ ra chỉ đáng ném sọt rác.

Refactor mang lại quá nhiều cái lợi: mã ngắn gọn dễ hiểu, dễ bảo trì, dễ sửa, dễ sử dụng, dễ mở rộng v.v.

Lập trình cho interface hơn là implementation

Nếu bạn nghĩ kế thừa (inheritance) chỉ đem lại cho bạn lợi ích "code reusable" thì đó mới chỉ là một nửa câu chuyện. Phần còn lại của câu chuyện là kế thừa tạo ra một họ các đối tượng có chung một giao diện (interface) thống nhất, từ đó thực hiện polimophism. Thông qua polimophism, client không cần (và không muốn) làm việc trực tiếp với object nào mà chỉ muốn làm việc với interface thôi. Nhờ đó mà hệ thống uyển chuyển hơn nhiều.

Chẳng hạn bưu điện là interface có chức năng gửi thư. Bạn là client. Có nhiều kiểu (type) chuyển thư: xe bò, xe gắn máy, ô tô, máy bay. Với tư cách là client, bạn chỉ muốn và chỉ cần quan tâm đến thằng interface, tức là bưu điện: cho thư (đã dán tem) vào thùng là thư được gửi đến nơi, mà không muốn quan tâm đến chuyện người ta dùng xe bò hay máy bay.

Dùng composition hơn là inheritance

Khi cấu trúc inheritance (thừa kế) càng dài, thì hệ thống càng kém uyển chuyển. Khi B và C thừa kế A, thì giữa B-A và C-A có mối ràng buộc theo chiều dọc. Khi B muốn A thay đổi thì khó mà thay đổi A ngay, vì còn đụng đến C. Chẳng phải các văn bản thủ tục hành chính càng chồng chéo, thì nhân dân càng mệt hay sao? Chẳng phải người ta cũng muốn cải cách mà không thể cải cách ngay (hoặc chẳng thể?) hay sao?

Do đó, nên làm cho cây thừa kế càng thấp càng tốt, biến chiều dọc thành chiều ngang bằng cách dùng composition.

Delegate

Nôm na là: nhờ được thằng hàng xóm cái gì, thì hãy nhờ ngay. Thoạt nghe thì rất vô trách nhiệm, nhưng hóa ra lại rất dân chủ. Các thể chế độc tài chẳng phải cái gì cũng ôm vào mình (điện, nước...), chẳng muốn nhả ra cái gì hay sao? Càng ôm thì càng đuối, đuội.

Thay vì ôm vào một cục, hãy san sẻ công việc ra.

Reference: Blog cong dong ve CNTT

Three Management Methods

If you want to lead a team, a company, an army, or a country, the primary problem you face is getting everyone moving in the same direction, which is really just a polite way of saying “getting people to do what you want.”

Think of it this way. As soon as your team consists of more than one person, you’re going to have different people with different agendas. They want different things than you want. If you’re a startup founder, you might want to make a lot of money quickly so you can retire early and spend the next couple of decades going to conferences for women bloggers. So you might spend most of your time driving around Sand Hill Road talking to VCs who might buy the company and flip it to Yahoo!. But Janice the Programmer, one of your employees, doesn’t care about selling out to Yahoo!, because she’s not going to make any money that way. What she cares about is writing code in the latest coolest new programming language, because it’s fun to learn a new thing. Meanwhile your CFO is entirely driven by the need to get out of the same cubicle he has been sharing with the system administrator, Trekkie Monster, and so he’s working up a new budget proposal that shows just how much money you would save by moving to larger office space that’s two minutes from his house, what a coincidence!

The problem of getting people to move in your direction (or, at least, the same direction) is not unique to startups, of course. It’s the same fundamental problem that a political leader faces when they get elected after promising to eliminate waste, corruption, and fraud in government. The mayor wants to make sure that it’s easy to get city approval of a new building project. The city building inspectors want to keep getting the bribes they have grown accustomed to.

And it’s the same problem that a military leader faces. They might want a team of soldiers to charge at the enemy, even when every individual soldier would really just rather cower behind a rock and let the others do the charging.

Here are three common approaches you might take:

  • The Command and Control Method
  • The Econ 101 Method
  • The Identity Method

You will certainly find other methods of management in the wild (there’s the exotic “Devil Wears Prada” Method, the Jihad Method, the Charismatic Cult Method, and the Lurch From One Method To Another Method) but over the next three days, I’m going to examine these three popular methods and explore their pros and cons.

Reference for more details: joelonsoftware


10 hãng gia công phần mềm IT lớn nhất 2008

Danh sách các doanh nghiệp gia công phần mềm lớn nhất thế giới năm 2008 chứng tỏ một điều "không đổi" trong ngành CNTT toàn cầu là “tất cả luôn thay đổi”.

Mới đây, Brown-Wilson Group (Mỹ) đã lập ra bản danh sách những nhà bán lẻ, gia công phần mềm CNTT có chất lượng quản lý tốt nhất dựa trên điều tra, khảo sát ý kiến của khách hàng trên toàn thế giới. Có một điều không thể không chú ý trong Black Book of Outsourcing 2008 (tạm dịch: Sách đen về gia công phần mềm - BBO 2008) là một số “đại gia” của năm 2007 đã bị đánh bật khỏi Top 50 do tỷ lệ khách hàng quá thấp như Infosys, Hexaware, EXL Service hay ICICI Firstsource. Ngành CNTT của Ấn Độ tiếp tục có những sự bứt phá ngoạn mục khi có đến 6 doanh nghiệp của họ góp mặt trong Top 50. Danh sách BPO 2008 còn chứng minh thêm một điều rằng: lĩnh vực gia công phần mềm giờ đây không còn là “đất diễn” của những doanh nghiệp yếu về kỹ thuật hay khả năng tài chính hạn hẹp.

Dưới đây là Top 10 của năm 2008:

1. Hewlett Packard

Hewlett Packard xứng đáng được nhận danh hiệu “kẻ tiếm ngôi vĩ đại” khi vươn lên số 1 từ vị trí thứ 8 trong danh sách 2007. Ngoài ra, Hewlett Packard cũng đứng đầu danh sách 10 nhà bán lẻ gia công phần mềm kế toán và tài chính hàng đầu thế giới.

Hiện Hewlett Packard đang có mặt tại hơn 170 quốc gia. Mới đây họ đã thực hiện thương vụ mua lại nhà cung cấp dịch vụ công nghệ Electronic Data Systems Corp. (EDS) với giá 13,2 tỷ USD. Động thái này sẽ giúp cho Hewlett Packard có thêm sức mạnh để thách thức đối thủ IBM trong "sân chơi" dịch vụ công nghệ đầy lợi nhuận.

2. Perot Systems

Perot Systems Corporation là nhà cung cấp các giải pháp IT bao gồm dịch vụ hạ tầng công nghệ, dịch vụ ứng dụng, dịch vụ tư vấn… Theo điều tra của Brown-Wilson, Perot Systems nhận được sự tán dương mạnh mẽ của các khách hàng thuộc các nhóm Chính phủ, chế tạo, máy móc, y tế và bảo hiểm. Perot Systems còn được tạp chí Fortune bình chọn là doanh nghiệp đứng thứ 2 trong danh sách Các doanh nghiệp đáng khâm phục nhất của Mỹ trong lĩnh vực dịch vụ công nghệ thông tin.

3. Computer Sciences Corp

Công ty tư vấn và dịch chuyển hoạt động toàn cầu CSC chuyên cung cấp các ứng dụng, quy trình kinh doanh và giải pháp dịch chuyển hoạt động cơ sở hạ tầng IT. Với lượng khách hàng trải rộng trên 50 quốc gia và gần 90.000 lao động, CSC cũng đứng đầu danh sách các doanh nghiệp có sự hồi phục mạnh mẽ nhất trong 5 năm (2004-2008).

CSC mới đây đã ký một hợp đồng gia công IT với nhà sản xuất máy bay Hawker Beechcraft Corp.

4. Unisys

Công ty Unisys Corp (Mỹ) kết hợp chuyên môn về hoạt động tư vấn, hợp nhất hệ thống, gia công, cơ sở hạ tầng và công nghệ máy chủ. Unisys, hoạt động trong lĩnh vực kinh doanh phần cứng cũng như các máy chủ doanh nghiệp chế tạo, dự định xây dựng một phòng thí nghiệm phần mềm ở Mexico với số vốn đầu tư 50 tỷ USD trong 3 năm tới.

5. EDS

Electronic Data Systems Corp (tên viết tắt là EDS) ra đời từ năm 1962 với số vốn ban đầu chỉ là 1.000 USD nhưng hiện nay tổng tài sản của họ đã lên đến 20 tỷ USD. Tuy vậy, năm 2008 không được coi là năm thành công của họ khi “rớt hạng” từ vị trí số 1 trong danh sách BBO 2007 xuống vị trí thứ 5 như hiện nay. Dự kiến, EDS sẽ giúp HP tăng cường sự hiện diện trong các dịch vụ công nghệ bao gồm điều hành các trung tâm máy tinh dữ liệu, kết hợp các chương trình phần mềm và tư vấn các dự án đặc biệt cho khách hàng doanh nghiệp và chính phủ.

6. Wipro

Đây là lần đầu tiên Wipro xuất hiện trong BBO 2008 trong khi "kình địch" của họ là Infosys đã rơi khỏi Top 10. Theo Brown-Wilson Group, chiến lược gia công đảo ngược của Wipro ở các thị trường Mỹ và Anh đã giúp hãng trở thành một công ty được ưa thích của các khách hàng Mỹ. Wipro cung cung cấp dịch vụ gia công IT trong các lĩnh vực ngân hàng và thị trường vốn, bảo hiểm, lữ hành và chế tạo sản phẩm công nghệ cao, viễn thông, y tế, tài chính và kế toán... Nghiên cứu trên dự đoán nhu cầu chuyển giao hoạt động kinh doanh của các khách hàng sẽ đưa Wipro tới một thành công lớn trong năm 2009.

7. Satyam

Bên cạnh vị trí thứ 7 trong danh sách BPO 2008, Satyam cũng giữ vị trí thứ 4 trong danh sách 10 nhà bán lẻ gia công kiến thức (KPO) hàng đầu thế giới. Trong quý I/08, Satyam đã thông báo một mức tăng 18,5% khi mà sự suy giảm ở thị trường Mỹ thu hút các thỏa thuận gia công. Tuy vậy, Satyam đang tích cực thúc đẩy khoảng 20 thỏa thuận lớn có giá trị 50-100 triệu USD/vụ để đánh bại xu hướng suy giảm.

8. Genpact

Genpact hoạt động trong lĩnh vực quản lý các quy trình kinh doanh cho các doanh nghiệp trên toàn cầu. Với hơn 19.000 lao động và hoạt động trải dài tại 9 quốc gia, tốc độ tăng trưởng của Genpact được dự báo là sẽ tăng khoảng 30-35% trong năm tới.

9. Automatic Data Processing (ADP)

ADP chuyên cung cấp các giải pháp dịch chuyển hoạt động kinh doanh. Doanh thu năm 2008 của họ là gần 8 tỷ USD. ADP cũng là nhà cung cấp hàng đầu thế giới về các giải pháp máy tính hợp nhất cho các doanh nghiệp kinh doanh ô tô, xe tải nặng, xe máy, các phương tiện giải trí và hàng hải trên toàn cầu. Theo nghiên cứu trên, các mô hình HR chú trọng khách hàng xây dựng các bảng lương và dịch vụ do lợi ích dẫn đầu đang thịnh hành và giúp ADP giành được chỗ đứng trong tốp 10 nói trên.

10. Ciber

Ciber là một công ty tư vấn hợp nhất hệ thống quốc tế. Thu nhập hàng năm của họ xấp xỉ 1,2 tỷ USD, Ciber cho biết doanh thu của hãng trong quý I/08 đã đạt 294,5 triệu USD. Ciber, cung cấp cơ sở nhân lực chiến lược, ở cả môi trường cả gói kế hoạch tài nguyên doanh nghiệp và hải quan (ERP), mới đây đã mua lại hai nhà cung cấp dịch vụ SAP ở Thụy Điển và Mỹ.

10 công cụ miễn phí tốt nhất cho .NET

Không thể có ứng dụng tốt nếu không có công cụ phát triển tốt, dù là phát triển với bất kỳ ngôn ngữ (lập trình) nào, ngay cả với các ngôn ngữ 'mạnh' của nền tảng .NET hiện đang 'nổi đình nổi đám'. Ngoài công cụ phát triển ứng dụng 'chính thống' và 'đồ sộ' như Visual Studio .NET (VS.NET) của Microsoft, cộng đồng phát triển .NET hiện nay có thêm nhiều lựa chọn với các công cụ gọn nhẹ hơn và đặc biệt là có mã nguồn mở hay miễn phí.

Bài viết này giới thiệu 10 công cụ miễn phí tốt nhất dành cho các nhà phát triển .NET, trong số đó có những công cụ giúp phát triển ứng dụng nhanh hơn và có những công cụ có thể làm thay đổi hẳn cách thức bạn viết mã lệnh (code).

SNIPPET COMPILER

Snippet Compiler (http://www.sliver.com/dotnet/SnippetCompiler) là công cụ dùng để viết code, biên dịch và chạy, nó đặc biệt có ích đối với những đoạn code nhỏ (khi bạn không muốn tạo toàn bộ project VS.NET cùng với các tập tin đi kèm).

Ví dụ, đoạn code dưới đây gọi chạy một ứng dụng khác (Notepad) từ .NET. Bạn có thể thực thi (chạy) đoạn code này ngay trong Snippet Compiler (chỉ việc nhấn nút Play).

using System;

using System.Collections;

public class MyClass {

public static void Main() {

System.Diagnostics.Process proc = new System.Diagnostics.Process();

proc.StartInfo.FileName= 'notepad.exe';

proc.Start();

proc.WaitForExit();

}

}

REGULATOR

Regulator (http://royo.is-a-geek.com/regulator) là công cụ hoàn chỉnh dùng để biên dịch và kiểm tra biểu thức chuỗi, đây là vấn đề hiện được quan tâm vì được ứng dụng nhiều trong .NET. Biểu thức chuỗi được dùng để định nghĩa các chuỗi ký tự và số, thường được dùng để so trùng dữ liệu người dùng nhập vào hay để tìm chuỗi ký tự trong một chuỗi lớn hơn.

Regulator cho phép bạn nhập vào một biểu thức chuỗi và dữ liệu đầu vào để kiểm tra. Bằng cách này bạn có thể thấy cách thức làm việc của biểu thức và kết quả trả về trước khi thực hiện trong ứng dụng.

Một trong những đặc tính hấp dẫn nhất của Regulator là khả năng tìm thư viện biểu thức trực tuyến ở regexlib.com. Ví dụ, nếu nhập vào chuỗi 'phone' trong ô tìm kiếm, bạn sẽ tìm thấy hơn 20 biểu thức khác nhau so khớp số điện thoại, bao gồm các biểu thức áp dụng cho số điện thoại ở Anh, Úc...

CODESMITH

CodeSmith (http://ericjsmith.net/codesmith) là công cụ sinh mã dựa trên template (mẫu có sẵn) dùng cú pháp tương tự như ASP.NET để sinh ra dạng code hay text bất kỳ, từ tập hàm đơn giản đến toàn bộ ứng dụng. Không giống như nhiều công cụ sinh mã khác, CodeSmith không yêu cầu bạn mô tả thiết kế hay kiến trúc ứng dụng.

Khi xây dựng ứng dụng, bạn nhận thấy thường phải lặp đi lặp lại một số công việc, ví dụ như viết code truy cập dữ liệu hay xây dựng hàm. CodeSmith đặc biệt hữu dụng trong những tình huống như vậy, vì nó cho phép bạn tạo các template để thực hiện tự động các công việc này, không chỉ cải thiện hiệu suất làm việc mà còn tránh cho bạn sự nhàm chán.

CodeSmith có sẵn một số template, bao gồm các kiểu tập hợp .NET cũng như thủ tục, nhưng sức mạnh thực sự của công cụ này chính là khả năng tạo template riêng.

Template của CodeSmith là tập tin văn bản đơn thuần và bạn có thể tạo bằng công cụ soạn thảo văn bản bất kỳ, chỉ với yêu cầu là lưu lại với đuôi .cst. Đầu tiên, bạn tạo phần đầu khai báo ngôn ngữ dùng cho template, ngôn ngữ kết quả và mô tả vắn tắt template.

<%@ CodeTemplate Language='C#'
TargetLanguage='C#'
Description='Car Template' %>

Phần kế tiếp của template khai báo các thuộc tính sẽ được xác định khi template chạy. Ví dụ dưới đây khai báo một thuộc tính chuỗi (string).

<%@ Property Name='ClassName' Type='String' Category='Context'
Description='Class Name' %>

Bước tiếp theo xây dựng phần thân template với mã lệnh tương tự ASP.NET, bạn có thể dùng bất kỳ lệnh .NET nào.

CodeSmith khá dễ dùng và có thể cho ra những kết quả tuyệt vời nếu được sử dụng đúng đắn. Một trong những phần phổ biến nhất của ứng dụng thích hợp cho việc sinh mã là truy cập dữ liệu. CodeSmith có tích hợp thành phần đặc biệt gọi là SchemaExplorer có thể dùng để sinh các template cho bảng dữ liệu (table), thủ tục lưu trữ (stored procedure) và gần như bất kỳ đối tượng SQL Server.

NUNIT

NUnit (hhtp://www.nunit.org) là khung kiểm tra đơn vị chương trình (như lớp, hàm hay module) có mã nguồn mở. Được phát triển theo mô hình JUnit (công cụ kiểm tra nổi tiếng dùng cho Java), nhưng NUnit được viết bằng C# và khai thác được ưu điểm của các ngôn ngữ .NET.

NUnit cho phép bạn viết hàm kiểm tra lỗi (unit test) theo ngôn ngữ lựa chọn để kiểm tra một chức năng cụ thể của chương trình. Unit test là cách thức tốt để kiểm tra hoạt động của đoạn code viết mới, và cũng là một phương thức kiểm tra hồi quy ứng dụng. Các unit test có thể lưu lại và chạy lại mỗi khi bạn sửa đổi code, điều này giúp phát hiện lỗi dễ dàng hơn và đảm bảo phát triển ứng dụng tốt hơn.

NUnit cung cấp khung để viết các unit test, và còn có giao diện đồ họa để chạy các unit test và xem kết quả. Ví dụ, chúng ta sẽ kiểm tra hoạt động của lớp Hashtable trong .NET với việc thêm vào và lấy ra 2 đối tượng. Bước đầu tiên là tham chiếu đến NUnit.Framework để có thể dùng các thuộc tính và hàm của NUnit; kế tiếp, tạo một lớp và đánh dấu nó với thuộc tính [TestFixture] để NUnit biết lớp này có hàm kiểm tra.

using System;

using System.Collections;

using NUnit.Framework;

namespace NunitExample {

[TestFixture]

public class HashtableTest {

public HashtableTest() { }

}

}
Kế tiếp, chúng ta tạo một hàm và đánh dấu với thuộc tính [Test] để NUnit biết đây là hàm kiểm tra. Trong hàm này chúng ta sẽ thiết lập Hashtable và đưa vào 2 giá trị, sau đó dùng hàm Assert.AreEqual để truy xuất 2 giá trị này.

[Test]

public void HashtableAddTest(){

Hashtable ht = new Hashtable();

ht.Add('Key1', 'Value1');

ht.Add('Key2', 'Value2');

Assert.AreEqual('Value1', ht['Key1'], 'Wrong object returned!');

Assert.AreEqual('Value2', ht['Key2'], 'Wrong object returned!');

}

Để chạy thủ tục kiểm tra, bạn cần xây dựng project, mở nó trong NUnit và nhấn nút Run. Bạn cũng có thể tải về NUnit Visual Studio .NET add-in (http://sourceforge.net/project/nunitaddin) để chạy kiểm tra trực tiếp trong Visual Studio.

FXCOP

FxCop (http://www.gotdotnet.com/team/fxcop) là công cụ kiểm tra gói chương trình đảm bảo tính tương thích với những quy tắc của .NET Framework (http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/cpgenref/html/cpconnetframeworkdesignguidelines.asp): Thiết kế thư viện, vấn đề bản địa, quy cách đặt tên, hiệu suất, bảo mật. FxCop do Microsoft phát triển và kèm theo tập các quy tắc do Mircosoft đưa ra, tuy nhiên bạn có thể tạo thêm những quy tắc riêng.

Ví dụ, chúng ta hãy xem FxCop kiểm tra và phát hiện lỗi trong gói NUnitExample ở trên. Trước hết, bạn cần tạo một project FxCop và đưa vào gói mà bạn muốn kiểm tra, sau đó nhấn Analyze và FxCop sẽ kiểm tra và đưa ra thông báo lỗi (Hình 3).

FxCop có thể giúp bạn viết code tốt hơn nhưng nó không thể sửa chữa thiết kế tồi hay lập trình kém. FxCop cũng không thể thay thế việc kiểm tra code nhưng nó cho phép bạn dành nhiều thời gian hơn cho những vấn đề quan trọng hơn là quy ước đặt tên.

.NET REFLECTOR

.NET Reflector (http://aisto.com/roeder/dotnet) là công cụ 'dịch ngược' (decompiler) và duyệt danh sách lớp, có thể giúp bạn khám phá tất cả 'bí mật' bên trong một gói. .NET Framework đưa ra reflection dùng để xem code .NET bất kỳ, dù là lớp đơn hay toàn bộ gói chương trình ('reflection' là tính năng cho phép ứng dụng truy vấn siêu dữ liệu của chính nó). Reflection cũng có thể dùng để truy xuất thông tin từ các lớp, hàm và thuộc tính khác nhau trong một gói nào đó. .NET Reflector cho phép bạn duyệt danh sách các lớp và hàm trong một gói, bạn có thể xem xét ngôn ngữ trung gian của Microsoft (MSIL) được sinh ra từ các lớp và hàm này, và có thể dịch ngược các lớp và hàm sang C# hay VB.NET.

Ví dụ, chúng ta dùng .NET Reflector xem xét gói NUnitExample ở trên, hình 4 thể hiện gói này khi được nạp. Để xem MSIL của một hàm, bạn nhấn chọn hàm và chọn menu Disassembler, hay chọn menu Decompiler để xem ở dạng ngôn ngữ C#. Bạn cũng có thể dịch ngược hàm sang VB.NET hay Delphi bằng cách thay đổi tùy chọn trong menu Language.

.NET Reflector đặc biệt có ích để tìm hiểu các hàm và gói trong .NET Framework. Ví dụ, dùng .NET Reflector bạn có thể biết được cách thức mà Microsoft dùng với hàm ReadXml. .NET Reflector cũng rất có ích để tìm hiểu cách thức tạo các đối tượng như HttpHandlers, và qua đó biết được cách thức mà nhóm phát triển của Microsoft đã xây dựng các đối tượng trong Framework.

NDOC

Việc lập tài liệu chương trình luôn là công việc khó gây hứng thú. Ở đây không nói về tài liệu thiết kế mà là tài liệu hàm và thuộc tính của lớp. Công cụ NDoc (http://ndoc.sourceforge.net) sẽ tự động sinh tài liệu cho chương trình của bạn bằng cách dùng reflection để truy vấn thư viện và dùng XML được sinh từ chú thích XML C#. Chú thích XML chỉ có hiệu lực cho C#, tuy nhiên công cụ VB.DOC (http://vb-doc.sourceforge.net) và VBCommenter của VS.NET Power Toy có thể thực hiện tương tự cho VB.NET. Ngoài ra, phiên bản kế tiếp của Visual Studio sẽ hỗ trợ nhiều ngôn ngữ hơn.

Đầu tiên, bạn dùng NDoc để sinh chú thích XML cho gói chương trình. Nhấn phải project và chọn Properties.Configuration Properties.Build, sau đó nhập vào đường dẫn nơi lưu tập tin XML trong tùy chọn XML Documentation File. Dưới đây là tài liệu của hàm trong ví dụ NUnit.

///



/// This test adds a number of values to the Hashtable collection

/// and then retrieves those values and checks if they match.

///


[Test]

public void HashtableAddTest(){

//Method Body Here

}

Tài liệu XML của hàm này sẽ được trích xuất ra và lưu lại trong tập tin XML.



This test adds a number of values to the Hashtable collection
and then retrieves those values and checks if they match.




Sau khi sinh ra tập tin XML, bước kế tiếp nạp gói chương trình và tập tin XML vào NDoc để xử lý. Việc này được thực hiện đơn giản bằng cách mở NDoc và nhấn nút Add. Sau khi khai báo thuộc tính đầu ra, nhấn nút Generate để bắt đầu quá trình sinh tài liệu.

NANT

NAnt (http://nant.sourceforge.net), phiên bản .NET của Ant được hỗ trợ với dự án Jakarta (khá phổ tiếng trong cộng đồng phát triển Java), là công cụ cho phép dễ dàng tạo qui trình build (biên dịch và tích hợp ứng dụng) dựa trên XML. Khi có nhiều nhà phát triển cùng làm việc trên một dự án, bạn không thể phó thác việc build cho từng người, và chắc bạn cũng không muốn thực hiện build thủ công nhiều lần mỗi ngày. NAnt cho phép bạn build tự động toàn bộ ứng dụng, chép các tập tin, chạy các kiểm tra NUnit, gửi email và nhiều chức năng khác. NAnt dùng các tập tin XML để khai báo những tác vụ cần thực hiện trong quá trình build. Lưu ý là MSBuild, thành phần trong phiên bản mới Visual Studio 2005, có tính năng tương tự và có thể thay thế NAnt.

Ví dụ dưới đây là tập tin XML (có phần đuôi là .build) để biên dịch ứng dụng NUnitExample với NAnt.





The NUnit Example Project





debug='${debug}'>

















Tập tin XML này được lưu ở thư mục gốc của project NUnitExample. Bạn đến thư mục này và chạy nant.exe để biên dịch ứng dụng.

Tuy không dễ dàng như việc nhấn Build trong Visual Studio, nhưng NAnt là công cụ rất mạnh dùng để xây dựng qui trình build chạy tự động theo lịch biểu.

Công cụ chuyển đổi

Cuối cùng là 2 công cụ đơn giản nhưng rất hữu dụng. Đầu tiên là ASP.NET Version Switcher (http://www.denisbauer.com/NETTools/ASPNETVersionSwitcher.aspx), công cụ này dùng để chuyển đổi phiên bản (version) ASP.NET của một website đang hoạt động. Công cụ thứ hai là Visual Studio Converter (http://www.codeproject.com/macro/vsconvert.asp) dùng để chuyển đổi tập tin project từ VS.NET 2002 sang VS.NET 2003 hay ngược lại.

IIS sử dụng cơ chế ánh xạ phần mở rộng (extension) để xử lý yêu cầu một website. Khi cài ASP.NET 1.1, cơ chế này được nâng cấp phiên bản mới và gây lỗi khi chạy ứng dụng được xây dựng trên ASP.NET 1.0. Để giải quyết vấn đề này, bạn có thể chuyển tất cả ánh xạ phần mở rộng của website về phiên bản 1.0, tuy nhiên, thực hiện thủ công việc này rất vất vả và đây chính là nơi 'dụng võ' của ASP.NET Version Switcher. Tiện ích nhỏ này có thể dùng để chuyển version .NET của bất kỳ ứng dụng ASP.NET nào. Công cụ này càng có ích khi tương lai có thêm các phiên bản mới ASP.NET và .NET Framework.

Visual Studio Converter tương tự như ASP.NET Version Switcher, ngoại trừ việc nó được dùng để chuyển đổi version của tập tin project Visual Studio. Mặc dù chỉ có một ít khác biệt giữa .NET Framework version 1.0 và 1.1, một khi tập tin project được chuyển từ VS.NET 2002 sang VS.NET 2003 thì không thể chuyển ngược lại. Tuy nhiên, đôi khi việc chuyển ngược lại cần thiết. Công cụ Converter này cho phép chuyển bất kỳ tập tin solution hay project từ Visual Studio 7.1 (VS.NET 2003) về Visual Studio 7.0 (VS.NET 2002) và ngược lại.