Code quality’s singular metric

There are some excellent articles and posts around the internet recently related to a question asked on LinkedIn about metrics and code quality. Specifically, the question asked was:

What are the useful Metrics for Code Quality?

The user goes on to state that

The quality of any software application will depend mostly on its code base and it’s important to know what might be the key metrics that help us to evaluate the stability and quality of the code base.

Many of the answers bring up excellent points, including different ways of viewing the question, such as taking the time to understand what attributes of code are related back to quality. For example, Michael Bolton aptly suggests you ask if the code is:

* testable
* supportable
* maintainable
* portable
* localizable

What’s more, further answers suggest coverage, code size, and other metrics as discrete measurements that can help gauge quality. These are all excellent answers; however, the answer turns out to be quite simple.

We have found time and time again that there is one metric that most appropriately relates to code quality: Cyclomatic complexity. If your code base has highly localized pockets (i.e. methods) of Cyclomatic complexity (or CC) your code will have issues (undoubtedly affecting quality how ever you define it) eventually.

In fact, CC affects arguably every attribute listed above (testable through localizable). Think about it for a minute: a method that has 27 different paths is next to impossible to adequately test, which means you’re going to have a doozy of time supporting it because it isn’t easy to maintain. Code that is littered with high CC is a blast to port as well (hopefully you’ve got deep pockets and customers that absolutely love you). Good luck localizing it too.


It turns out that the other metrics mentioned (such as code size) tend to correlate to each other– in fact, it seems that all complexity-like metrics point back to CC. Classes that have a lot of dependencies are usually big and big classes usually have big methods and big methods usually have lots of conditionals. Lots of conditionals mean a high CC value (CC measures paths through a method, such as from an if/else chain).

Code coverage is an excellent metric for ascertaining what code isn’t touched by tests and it happens to relate directly to CC because in order to reach 100% branch coverage you’d have to have a one to one relationship with CC (i.e. if a method has 27 different paths, you’d need 27 tests to reach full coverage). Plus, coverage can be unfortunately misleading and can provide a false sense of security.

The beauty of CC is that it’s one metric. One number is all you need to understand risk. You can then apply it in many ways. For example, we provide development teams with ratios related to CC (because CC precisely delineates complex methods it’s often helpful to relate it to other normalized metrics) that enable them to gauge quickly the overall health of a code base. When the ratios grow, things are getting worse and when they decrease, happiness ensues.

The definition of quality (and its associated attributes) as it relates to software has traditionally been quite hard to nail down (regardless if you are a customer or a developer); however, one thing is factual– complex code is a house of cards that will eventually collapse (via attrition, bankruptcy, ossification, etc). Finding complexity and proactively reducing it will lead to software that is more testable, maintainable, and supportable. And by the way, that happens to be the kind of software customers like.

Hiendt(theo testearly.com)

Đọc tiếp >>

Cao Trong Hien

Dự án Eclipse Open Source (OS) IDE sẽ chết


Bản chính thức của Netbeans 6 xắp ra mắt, và sự xuất hiện của nó có thể làm cho những lập trình viên đang dùng Eclispe phải suy nghĩ.

Một năm rưỡi sau phiên bản chính thức cuối cùng của Netbeans, cho ta một cách nhìn mới về OS IDE.

Theo kế hoạch thì tháng 11 này, bản chính thức Netbeans 6 sẽ ra đời. Mặc dù là bản beta nhưng Netbeans đã có hàng trăm add-on, những module này đã hỗ trợ bởi Netbeans trong bản chính thức, và dễ dàng cấu hình. So với những add-on chồng chéo của Eclipse thì Netbeans là một sự lựa chọn tốt.

Trong bản chính thức của Netbeans 5.5, ngoài phần core, nó còn có thêm một số add-on(trong đó có Visual Web Pack), mà theo một số người là không một OS IDE nào sánh được. Với Netbeans 6, người phát triển có thể phát triển core, có thể cung cấp thêm một số chức năng.

Netbeans đã update thêm một số chức năng mới trong Java SE 6, với JSR 199(Java compiler API) và JSR 269(plugable annotation processing API).

Giải thưởng Bossie Award cho OS IDE tốt nhất.
Tôi xin liệt kê một số tính năng nổi bật:

1.Cấu trúc cây thân thiện
2.Refactoring code
3.Tìm kiếm nâng cao
4.Quản lý chất lượng
5.Ant 1.7.0
6.Junit 4
7.Mở và hiểu được project Maven 2
8.CVS
9.Debugger
10.Plug-in manager(Thay cho Update Manager trong bản 5.5)

Bạn có thể tham khảo thêm trên netbeans plugins

Tài liệu tham khảo
www.mc-showcase.com
www.infoworld.com

Đọc tiếp >>

Cao Trong Hien

Mày râu lý sự


Cuộc hôn nhân của đôi bạn trẻ đang rơi vào khủng hoảng. Nguy cơ đổ vỡ rất lớn. Nàng đưa ra cả chục lý do được xem là nguyên nhân gây cản trở hạnh phúc của hai người. Anh cũng có ngần ấy lời biện hộ cho lý do vợ mình đưa ra. Bạn có muốn làm quan tòa giúp họ?

1. Khi yêu, anh ấy không mua hoa tặng tôi.

2. Khi cưới, anh ấy không có nhà, chúng tôi phải thuê nhà cả năm trời.

3. Có nhà rồi nhưng lại không có lò sưởi làm tôi phải đốt lò suốt mùa đông.

4. Trước mặt tôi và bạn bè, anh ấy nói tình yêu và hôn nhân là hai chuyện khác nhau, chứng tỏ anh ấy không còn yêu tôi.

5. Khi tôi mới mang thai, anh ấy đi công tác, làm tôi đói hai ngày.

6. Khi tôi sinh rồi, gặp tôi anh hỏi con trai hay con gái trước, chứng tỏ anh ấy chẳng quan tâm gì đến tôi.

7. Anh ấy không quan tâm đến bố mẹ tôi bằng bố mẹ anh. Sinh nhật bố anh, anh xuống bếp làm món ăn cụ ưa thích còn sinh nhật bố tôi anh ấy không làm vậy.

8. Sau khi mua xe, anh ấy suốt ngày đưa đón bạn bè, bỏ tôi và con ở nhà.

9. Anh uống rượu còn lái xe làm tôi lo lắng đến suy nhược thần kinh.

10. Anh kết bạn với nhiều phụ nữ trong khi tôi lấy anh rồi không còn có bạn trai nữa. Thật không công bằng.

Lời biện hộ



1. Anh không mua hoa vì muốn dành dụm tiền mua nhà.

2. Không có nhà là để anh chăm sóc em chu đáo hơn trong khi chồng người khác lại dán mắt vào tivi hay tờ báo. Hai ta có thời gian đi dạo phố, để lại biết bao kỷ niệm êm dịu đúng không em?


3. Nhà không có lò sưởi, anh lại không biết đốt lò. Tối tối anh ôm em, dùng thân nhiệt của mình để sưởi ấm cho em. Anh muốn sưởi ấm cho em suốt cả cuộc đời.


4. Tình yêu và hôn nhân quả là hai chuyện khác nhau: tình yêu thì cần đến hoa tươi, còn hôn nhân thì cần đến nhà ở. Chẳng phải anh đã sớm tiết kiệm tiền mua hoa để dành dụm mua nhà cho em đấy sao?


5. Anh đi công tác để em không có cơm ăn không phải là muốn em đói mà muốn để cho con chúng ta nếm trải mùi vị của đói, đó là sự rèn luyện ban đầu đấy thôi.


6. Khi em sinh con, anh vội hỏi em con trai hay con gái là vì anh rất muốn có con trai. Như thế, trong nhà ta sẽ có thêm một người đàn ông nữa để bảo vệ em.


7. Sinh nhật bố, anh tự mình xuống bếp là muốn luyện "tay nghề", đợi sinh nhật ông nhạc anh sẽ trổ tài. Kết quả không thành công, vì thế ta mới đi ăn tiệm. Đó đâu phải là vì anh không tôn trọng cụ.


8. Anh luôn cho rằng ngồi trên xe không an toàn bằng ở nhà, vì vậy anh muốn để em và các con "an toàn" ở nhà.


9. Dù biết là không nên lái xe khi uống rượu, nhưng vì muốn nhanh chóng về nhà với em nên không kịp đợi đến khi tỉnh rượu, anh mới lái xe về nhà.


10. Anh rất tán thành phụ nữ sau khi kết hôn nên về nhà và yên tâm với thiên chức làm vợ, làm mẹ. Điều đó làm cho người đàn ông mà em gọi là "say sưa công việc" như anh sẽ không tiếp xúc được với phụ nữ trong công việc, nhưng vấn đề là liệu những người khác có tán thành hay không?


Theo Thế Giới Tiêu Dùng

Đọc tiếp >>

Cao Trong Hien

Send mail dùng SMTP

class MailAuthenticator.java
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

/**
*
* @author tronghiencao
*/
public class MailAuthenticator extends Authenticator {

private final String user;

private final String password;

public MailAuthenticator(String user, String password) {
this.user = user;
this.password = password;
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(this.user, this.password);
}
}

class SendMailExample.java
import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
*
* @author tronghiencao
*/
public class SendMailExample {
public void sendMail(String smtpHost,String username,
String password,String senderAddress,
String recipientsAddress,String subject,String text ) {
MailAuthenticator auth = new MailAuthenticator(username, password);
Properties properties = new Properties();

properties.put("mail.smtp.host", smtpHost);
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.port", "25");
properties.put("mail.smtp.starttls.enable", "true");//fix error: 530 5.7.0 Must issue a STARTTLS command first
Session session = Session.getDefaultInstance(properties, auth);
try {
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(senderAddress));
msg.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(recipientsAddress, false));
msg.setSubject(subject);
msg.setText(text);
msg.setHeader("Test", "Test");
msg.setSentDate(new Date( ));
Transport.send(msg);
} catch (Exception e) {
e.printStackTrace( );
}
}

public static void main(String[] args) {
String username = "nick";//nick no @yahoo.com or @gmail.com
String password = "password";//password
String senderAddress ="tronghiencao@gmail.com";//someone@web.com
String recipientsAddress = "caotronghien@yahoo.com"; //somereceiver@yahoo.de
String subject = "Test";
String text = "text";
String smtpHost = "smtp.gmail.com";
new SendMailExample().sendMail(smtpHost, username, password, senderAddress, recipientsAddress, subject, text);
}
}

Đọc tiếp >>

Cao Trong Hien

Tôi học JAAS

Kỳ 1: THẤT BẠI LÀ MẸ THÀNH CÔNG

Bước đầu đối với ai cũng thật sự tệ, và tôi cũng không ngoại lệ. Đầu tiên cũng như bao lần học những công nghệ khác, tôi vào Google. Kết quả: tôi tìm ra một tài liệu Security for JavaSE6. Tôi mày mò trong mục tutorial, tìm cách run. Kết quả: Thất bại, vì lý do tôi không biết cách run. Trước giờ tôi chỉ sài eclipse, chạy command line đối với tôi thật khó khăn, và cũng vì ngày sưa tôi quá coi thường nó (thời nay ai mà còn dùng command line).
Tài liệu thứ 2 mà tôi tìm thây là bài JAAS Security in Action trên devx.com. Cũng chỉ nói về hệ tư tửng, những định nghĩ, vv... Mà không chạy được làm sao mà hiểu được định nghĩa. Và tất nhiên kết quả không gì khác ngoài: THẤT BẠI.
Tôi bắt đầu mày mò một số bài viết tiếng Việt, và dĩ nhiên là trên javavietnam.org. Qua đó tôi được biết có một bài viết của bác Thắng trên tincntt.com. Mừng hết lớn, đọc lấy đọc để... Kết quá cũng thất bại, vì đơn giản đó chỉ là một bài dịch trên DevArticles, chẳng có một ứng dụng, và còn tệ hơn khi tác giả chẳng mảy may chú ý đến sự tiếp thu của người đọc. Lên nguồn tiếng anh thì thấy họ viết còn dễ hiểu hơn, có lẽ đó cũng là lý do người ta nói: các bài viết tiếng Việt thường “chuối”. (Có gì không phải vui lòng bỏ qua cho)

Kỳ 2: MỘT CHÚT KHẢ QUAN

Đúng là cái gì cũng phải kiên nhẫn, và cuối cùng cũng được kết qủa như mong muốn. Quyển đầu tiên đã giúp tôi thu nhập được nhiều thứ nhất chính là JAAS in action. Giới thiệu một cách khái quát về jaas, từ căn bản, đến những webapp dùng jaas. Những web application mà cuốn sách này tôi vẫn chưa chạy được, nhưng cũng giúp tôi bước đầu trên con đường chinh phục JAAS.
Để chạy được các ví dụ trong quyển sách này máy bạn cần có eclipse, và bạn cũng nên học một chút về ant trên eclipse.
Tôi lại tiếp tục trên con đường tiềm kiếm một app hoàn chỉnh, và đã thấy trên JEE5 tutorial, và tôi đã run được ứng dụng web đầu tiên.

Kỳ 3: KẾT QUẢ ĐẠT ĐƯỢC

Trên con đường đi tìm, tôi đã gặp và nằm lòng những khái niệm
User: Người dùng, và trong jaas nó không được biểu diễn bằng một Object
Subject: là một thực thể đại diện cho user trên ứng dụng.
Principal: Đại diện cho một (Administrator) hoặc nhiều (Group manager) Subject.
Resource: Tất cả mọi thứ trong hệ thống của chúng ta.
Permission: Quản lý Resource, Một permission class đại diện cho 3 thứ: resource, action và name. Nó có thể được gán cho một Principal.
Authentication: Hành động kiểm tra một user, gán cho subject của user này một principal; bạn là ai
Authorization: Hành động kiểm tra một user, và cấp phép truy cập resource; bạn có thể làm gì.
Authentication module: Phương thức xác nhận user.
Authentication scheme: Bao gồm nhiều Authentication module.

Kỳ 4: CẤU HÌNH SUN APPLICATION SERVER

Để Application Server xác định quyền users, ta làm theo các bước sau
1.Start server
2.Vào admin console( mặc định là http://localhost:4848/asadmin)
3.Gõi username và password (thường là admin và adminadmin)
4.Mở cây bên trái chọn Configuration\ Security\ Realms\. Ta có thể có 3 lựa chọn:
file: tạo user cho phép truy cập vô ứng dụng
admin-realm: tạo user cho phép tác động vào server admin
certificate
5.Chọn manage users, ở đó bạn có thể thêm, xoá, và sửa thông tin user.
6.OK
7.Logout

Kỳ 5: EJB+JAAS HelloWorld APPLICATION

Bạn nên dùng Netbeans 5.5.1 + Sun Application Server 9
Bước 1: Tạo một Enterprise Application
Proejct name: HelloWorld
Bỏ check Create Web application module
Check vào mục create application client module
Sửa tên main class thành com.bds.test.Client
Bước 2: Tạo session Bean
EJB Name: HelloWorld
Package: com.bds.ejb
Check remote, bỏ check local

HelloWorldBean.java
@DeclareRoles("admin")
@Stateless
public class WorldHelloBean implements WorldHelloRemote {
/** Creates a new instance of WorldHelloBean */
public WorldHelloBean() {
}
@RolesAllowed("admin")
public void sayHello(String name) {
System.out.println("Hello "+name);
}
}

HelloWorldRemote.java
@Remote
public interface WorldHelloRemote {
void sayHello(String name);
}

Bước 3: Test
Ta chỉ cần remote đến WorldHelloBean để dùng:

public class Client {

@EJB
private static WorldHelloRemote worldHelloBean;

/** Creates a new instance of Client */
public Client(String[] args) {
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Client c = new Client(args);
c.doTest();
// TODO code application logic here
}
public void doTest(){
worldHelloBean.sayHello("Hien");
}
}

Bước 4: Khai báo <security-role-mapping>
Trong helloworld project: sửa file sun-application.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-application PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Java EE Application 5.0//EN" "http://www.sun.com/software/appserver/dtds/sun-application_5_0-0.dtd">
<sun-application>
<security-role-mapping>
<role-name>admin</role-name>
<group-name>admin</group-name>
</security-role-mapping>
</sun-application>

Bước 5: Run
Để chạy được project này bạn cần có một user có ID:admin, password: admin, group: admin.
Sau đó ta chỉ run project helloworld

Kỳ 6: JAAS-WEB APPLICATION
Writing...
TÀI LIỆU THAM KHẢO
http://java.sun.com/products/jaas/overview.html
http://www.mooreds.com/jaas.html
http://www.tincntt.com/tincntt/cms/vi/tutorials/java_tutorials/jaas_1.html
http://java.sun.com/javaee/5/docs/tutorial/doc/Overview9.html

Đọc tiếp >>

Cao Trong Hien

,

Có một nhân viên mới? Đưa anh ta một Cookbook!

Ta đã có đủ lập trình viên cho một dự án và muốn tăng tốc nó, lúc đó dĩ nhiên là phải tìm thành viên mới cho nhóm, và thường thì không phải vậy (project nhanh hơn). Trong một khoảng thời gian dài để tìm ra một cách thích hợp - tự mình trainning và cùng làm việc – nhưng cũng không khá hơn được. Tốt hơn hết là hãy ngồi cạnh bên newbies và dùng tất cả khoảng thời gian quý giá của mình để trainning. OK... cứ cho là vậy, nhưng sẽ ra sao nếu ta không phải cần 1 mà cần hơn thế? Trainning tiếp ư? Các bạn thân mến, hãy viết cho project mình một “Cookbook”, nó sẽ giúp bạn tiết kiệm thời gian.

Tôi là một thành viên phát triển cho một project bao gồm nhiều java applications cùng dùng một database là Oracle. OK… mọi công ty đều thế cả, nhưng đều có một điểm chung khi có thêm một thành viên mới, và dĩ nhiên là anh ta cần người giúp để có thể làm việc. Mọi người đều có một nhiệm vụ cho mình và dĩ nhiên là họ cũng không còn thời gian để làm chuyện đó. Anh ta sẽ không thể theo kịp, và project sẽ có sự xáo trộn!!!

Những điều mà cookbook cần có:
1. Nội dung phải là tutorial hay hướng dẫn sử dụng, hoặc cả hai.
2. Cung cấp những thông tin cần thiết cho newbie để họ có thể tự làm
3. Bao gồm đầy đủ code
4. Miêu tả ngắn về nội dung cần làm
5. Và nhất là phải có code ví dụ
(dịch từ http://blog.technocog.com/?p=10)

Đọc tiếp >>

Cao Trong Hien

Chuyện hằng ngày

Thường thì bạn giải quyết sao khi gặp một vấn đề? Với tôi thật đơn giản (và có một điếu mà ai cũng biết: tui là dân IT) :

1.Google. Trong bước này bạn rất hay bỏ sót một số từ khoá quan trọng, vì vậy bạn cần hết sức kiên nhẫn.

2.Nhờ vả. Thường thì bạn làm việc trong cùng công ty, sau đó là bạn học, và cuối cùng là bạn quen bên ngoài. Nói chung mối quan hệ giúp ta rất nhiều vấn đề.

3.Tự tìm cách giải quyết. Thật sự tệ hại khi phải làm bước này, và tốt nhất là đừng quá thường xuyên nhé.

4.Viết cách giải quyết vấn đề này lên blog. Tôi thường làm điều này với một niềm vui nho nhỏ, khoe với bạn bè, hay hơn nữa là với nhà tuyển dụng.

Hiendt(st)

Đọc tiếp >>

Cao Trong Hien