SỬ DỤNG APACHE ANT TRONG LẬP TRÌNH JAVA

Thứ Ba, 8 tháng 12, 2009 1 nhận xét

1.Giới thiệu:
Hãy tưởng tượng xem khi bạn đang thực hiện một đề án lớn bằng Java, nó bao gồm nhiều tập tin java và những lớp (class) phụ thuộc vào những lớp khác hay những lớp stub hoặc driver chẳng hạn. Chúng được chứa trong nhiều thư mục khác nhau, và kết quả thu được cũng cần đặt trong nhiều thư mục … và kết quả là bạn phải dùng những công cụ biên dịch và phải tự mình thao tác tất cả, và tất nhiên điều đó sẽ làm cho bạn mất hàng giờ để thực hiện việc đó. Vậy tại sao ta không phát triển một chương trình có thể thực hiện được những việc mà chúng ta cần và công cụ đó chính là ANT ( Bạn có thể tham khảo thêm tại website http://jakarta.apache.org/ant/ ).
ANT ( Another Neat Tool ), là công cụ xây dựng hỗ trợ đặc biệt cho lập trình bằng Java nhưng cũng có thể sử dụng cho nhiều thứ khác, vì đây là công cụ được viết hoàn toàn bằng Java nên không phụ thuộc vào bất cứ nền ứng dụng nào. Ant rất hữu ích trong công việc phức tạp đòi hỏi phải lập đi lập lại nhiều lần, vì vậy nên thích hợp với việc xử lý một cách tự động và được chuẩn hóa. Ant dùng định dạng XML để làm cơ chế hoạt động cho công cụ dưới dạng những lời hướng dẫn ( instructions), do đó dễ dàng mở rộng và bảo trì.

2.Cài đặt:
-Tải công cụ Ant từ địa chỉ sau : http://jakarta.apache.org/ant/index.html, sau đó giải nén vào một thư mục.
-Thêm đường dẫn đến thư mục /bin trong thư mục đã giải nén vào biến môi trường PATH.
-Thêm vào biến môi trường CLASSPATH đường dẫn đến những tập tin .jar trong thư mục /lib trong thư mục giải nén. (để biết thêm chi tiết xin xem thêm tại thư mục /docs/manual/install.html )
-
3.Cơ bản:
Tập tin xây dựng Ant được viết dưới dạng XML, nên chỉ cần có một phần mềm soạn thảo văn bản là có thể xây dựng tập tin Ant. Sau đây là ví dụ đơn giản:
Ví dụ 1 : build.xml

<?xml version="1.0"?>
<project name="test" default="compile" basedir=".">
<property name="src" value="."/>
<property name="build" value="build"/>
<target name="init">
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init">
<!- - Compile the java code - ->
<javac srcdir="${src}" destdir="${build}"/>
</target>
</project>

Mô tả:
<?xml version="1.0"?>
Vì đây là tập tin xml nên luôn được bắt đầu bằng thẻ này.

<project name="test" default="compile" basedir=".">
Thẻ gốc (root element) của tập tin Ant là <project>, nó có 3 thuộc tính sau:
-name: đây là tên của của đề tài
-default: mục này chỉ định thẻ <target> mặc định khi không có thẻ <target> nào được chỉ định, đây là thuộc tính bắt buộc phải có.
-basedir: chỉ định thư mục gốc mà bên trong tập tin Ant tham chiếu đến, nếu mục này bị bỏ qua thì thư mục hiện hành chứa tập tin Ant sẽ được sử dụng.

<property name="src" value="."/>
<property name="build" value="build"/>

Thẻ property cho phép khai báo biến để sử dụng trong tập tin Ant, thuộc tính name dùng đặt tên cho biến, và thuộc tính value chứa giá trị của biến đó. Để tham chiếu đến giá trị của biến này ta dùng cú pháp sau ${name-property}, như trong ví dụ trên để tham chiếu đến biến src ta dùng như sau ${src}

<target name="init">
<mkdir dir="${build}"/>
</target>

Thẻ <target> dùng để bao bọc một nhóm các hành động, mỗi thẻ có một tên để có thể tham chiếu đến ở bất kì đâu, có thể từ bên ngoài dưới dạng dòng lệnh, hay từ bên trong thông qua từ khoá depends, hoặc có thể từ một lời gọi trực tiếp. Trong ví dụ trên ta có thẻ <target> đặt tên là “init”, nó sẽ tạo ra một thư mục bằng cách sử dụng thẻ <mkdir> với tên được chỉ định bởi biến build đã được khai báo ở trên
Thẻ <target> có những thuộc tính sau:
-name: đặt tên cho thẻ để có thể tham chiếu đến sau này, thuộc tính này bắt buộc phải có
-depends: đây là một danh sách chứa các target khác mà thẻ target này phụ thuộc, các target được phân cách bằng dấu phẩy, các target nằm trong danh sách này phải được thực thi trước thẻ <target> này.
-if: cho phép thêm điều kiện để xét xem có thực hiện các hành động trong thẻ <target> không dựa trên giá trị của biến. Ví dụ if=”dk” ta có thể hiểu như sau: nếu biến dk được gán giá trị bất kì thì sẽ thực hiện các hành động trong thẻ <target>.
-unless: thuộc tính này ngược lại với if
-description: dùng để mô tả ngắn gọn cho thẻ <target>

<target name="compile" depends="init">
<!- - Compile the java code - ->
<javac srcdir="${src}" destdir="${build}"/>
</target>

Như đã mô tả ở trên, vì thuộc tính depends=”init” nên thẻ <target> này phải được thực thi sau khi thẻ target có tên là “init” được thực thi.
Ta thấy có thẻ javac được sử dụng trong ví dụ trên, thẻ này có thể hiểu như một nhiệm vụ, những nhiệm vụ cần thực hiện được lồng trong thẻ target. Trong trường hợp này thư mục chứa mã nguồn (srcdir) được gán bằng biến src mà ta đã khai báo và thư mục đích mà ta cần xuất kết quả ra (destdir) được gán bằng biến build, và khi target thực thi thì javac sẽ biên dịch các tập tin java trong thư mục srcdir (tham chiếu đến biến src) và trả về kết quả là các tập tin class được đặt trong thư mục destdir (tham chiếu đến biến build). Ngoài lệnh javax ra, ant còn hỗ trợ lệnh java để thực thi chương trình.

Sau khi hiểu rõ những tính năng của từng thẻ, hãy thực hiện ví dụ trên theo các bước sau:
-Chép mã nguồn ở ví dụ trên và lưu lại thành tập tin build.xml vào thư mục test
-Tạo một file java với nội dung bất kì ví dụ như sau:

public class test {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}

-Lưu tập tin java trên vào chung thư mục test
-Sau đó chạy dòng lệnh : ant –v
-Dòng lệnh này sẽ thực thi theo hướng dẫn trong tập tin build.xml, nó sẽ tạo ra thư mục build chứa tập tin class được biên dịch từ tập tin java. Tham số –v sẽ hiển thị thông tin trong quá trình lệnh ant thực thi (các tham số của lệnh ant tham khảo thêm tại phụ lục A).

4.Mô tả chi tiết về một đề án đặc trưng:
Khi bắt đầu tiến hành một đề án, thông thường ta sẽ tạo ra những thư mục sau :
-src: chứa các tập tin mã nguồn
-build: chứa các tập tin trả về sau khi biên dịch
-lib: chứa các tập tin dùng làm thư viện cho chương trình
Bây giờ ta sẽ tiến hành các bước sau để sử dụng Ant:
-Đầu tiên tạo tập tin AntDemo.java với nội dung như sau:

import javax.swing.*;
import java.awt.*;

public class AntDemo extends JFrame {
public AntDemo() {
super("Ant Demo");
ImageIcon icon = new ImageIcon("image.jpeg");
getContentPane().add(new JLabel(icon));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
}
public static void main(String args[]) {
new AntDemo();
}
}

-Tạo 3 thư mục src, build, lib trong thư mục test ta đã tạo ở trên, sau đó lưu tập tin AntDemo.java và image.jpeg vào thư mục src
-Bước tiếp theo ta sẽ tạo tập tin build.xml với nội dung như sau:

<?xml version="1.0"?>
<project name="AntDemo" default="all" basedir=".">
<property name="src" value="src"/>
<property name="build" value="build"/>
<property name="lib" value="lib"/>
<target name="all" depends="AntDemo" description="Builds the whole project">
<echo>Doing all</echo>
</target>
<target name="AntDemo" description="Builds the main AntDemo project">
<echo>Doing AntDemo</echo>
<copy file="${src}/image.jpeg" tofile="${build}/image.jpeg"/>
<javac srcdir="${src}" destdir="${build}"/>
</target>
</project>

-Lưu tập tin build.xml vào thư mục test, và chạy ant như phần trên. Kết quả thu được là:

Buildfile: build.xml
AntDemo:
[echo] Doing AntDemo
[copy] Copying 1 file to C:\docbook\docproj\src\items\ant\files\build
[javac] Compiling 1 source file to \blah\blah\blah\build
all:
[echo] Doing all
BUILD SUCCESSFUL
Total time: 2 seconds

Lưu ý: nếu muốn sử dụng các tham số trong câu lệnh java như : javac –v –listfiles … ta sẽ làm bằng cách gán cho các thuộc tính đó giá trị bằng “true”, ví dụ như muốn trong quá trình biên dịch muốn hiển thị danh sách các tập tin được biên dịch ta thêm vào thẻ javac ở trên thuộc tính sau: listfiles=”true”.
Trong ví dụ trên có một thẻ mới đó là thẻ <copy> , dùng để sao chép các tập tin vào các thư mục cần thiết, với thuộc tính srcdir chỉ định thư mục đang chứa tập tin cần sao chép, destdir chỉ định thư mục cần sao chép đến. Mặc định, ant chỉ sao chép lại những tập tin đã sao chép rồi khi chúng được thay đổi, nếu muốn ant luôn sao chép mỗi khi thực thi thì ta sẽ gán giá trị “true” cho thuộc tính overwrite cho thẻ copy.
Thẻ <echo> sẽ in nội dung ra màn hình thực thi.
Để hiểu rõ hơn ta sửa lại nội dung của tập tin AntDemo.java như sau:

public AntDemo() {
super("AntDemo");
ImageIcon icon = new ImageIcon("image.jpeg");
JButton exitButton = new JButton("Exit");
exitButton.addActionListener(new ExitControl());
JButton aboutButton = new JButton("About");
aboutButton.addActionListener(new AboutControl());
getContentPane().setLayout(new FlowLayout());
getContentPane().add(new JLabel(icon));
getContentPane().add(aboutButton);
getContentPane().add(exitButton);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
}

Tiếp theo, tạo tập tin ExitControl.java với nội dung sau:

import java.awt.event.*;

public class ExitControl implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}

Tạo tập tin AboutControl.java:

import java.awt.event.*;
public class AboutControl implements ActionListener {
public void actionPerformed(ActionEvent e) {
new AboutPopup();
}
}

Tạo tập tin AboutPopup.java:

import javax.swing.*;
import java.awt.*;

public class AboutPopup extends JFrame {
public AboutPopup() {
super("About");
String message = "\n";
message+="Bye bye world ???";
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setSize(new Dimension(300,300));
JTextPane messagePane = new JTextPane();
messagePane.setBackground(Color.BLACK);
messagePane.setForeground(Color.GRAY);
messagePane.setEditable(false);
messagePane.setText(message);
getContentPane().add(messagePane);
setResizable(false);
setVisible(true);
}
}

Lưu tất cả các tập tin java vào thư mục src và sửa đổi lại tập tin build.xml như sau:
-Ở phần thẻ target AntDemo:

<target name="AntDemo" depends="AboutControl,ExitControl"
description="Builds the main AntDemo project">
<echo>Doing AntDemo</echo>
<copy file="${src}/image.jpeg" tofile="${build}/image.jpeg"/>
<javac srcdir="${src}" destdir="${build}" includes="AntDemo.java"/>
</target>

Ta đã thêm vào depends="AboutControl,ExitControl" để báo cho ant biết rằng thẻ target này sẽ được thực thi sau khi thẻ target có tên AboutControl và ExitControl được thực thi. Ngoài ra trong thẻ javac có thêm thuộc tính includes để chỉ ra cho ant biết tập tin nào cần được biên dịch, trong ví dụ trên ta báo cho ant biết rằng chỉ biên dịch tập tin AntDemo.java trong thư mục được chỉ định trong thuộc tính srcdir. Giá trị của includes có thể là danh sách các tập tin cần được biên dịch, nếu bỏ qua includes thì ant sẽ biên dịch tất cả.
-Vì thẻ target AntDemo có thuộc tính depends=”AboutControl,ExitControl” nên ta sẽ thêm vào 2 thẻ target mới với tên tương ứng như sau:

<target name="AboutControl" depends="AboutPopup"
description="Builds AboutControl">
<echo>Doing AboutControl</echo>
<javac srcdir="${src}" destdir="${build}" includes="AboutControl.java"/>
</target>

<target name="ExitControl" description="Builds ExitControl">
<echo>Doing ExitControl</echo>
<javac srcdir="${src}" destdir="${build}" includes="ExitControl.java"/>
</target>

Thẻ target AboutControl có thuộc tính depends=”AboutPopup” để chỉ ra rằng thẻ target này sẽ được thực thi sau khi thẻ target AboutPopup được thực thi. Vì thế ta sẽ tạo thêm thẻ target có tên là AboutPopup như sau:

<target name="AboutPopup" description="Builds AboutPopup">
<echo>Doing AboutPopup</echo>
<javac srcdir="${src}" destdir="${build}" includes="AboutPopup.java"/>
</target>

-Cuối cùng ta sẽ thêm vào thẻ target Clean, được dùng để xoá tập tin trong thư mục được chỉ định như sau:

<target name="Clean" description="Removes previous build">
<delete verbose="true">
<fileset dir="${build}"/>
</delete>
</target>

Trong thẻ target trên ta có thẻ <delete> để chỉ ra rằng ta muốn xoá, thuộc tính verbose=”true” sẽ in ra danh sách các tập tin được xóa khi thực thi thẻ target. Thẻ <fileset> dùng để chỉ ra thư mục chứa các tập tin cần xóa với thuộc tính dir chứa đường dẫn đến thư mục đó. Nếu muốn xóa cả thư mục đó thì gán giá trị “true” cho thuộc tính includeEmptyDirs. (tham khảo thêm về thẻ fileset trong phần phụ lục B)
Để xoá các tập tin đã biên dịch trước kia, ta chạy lệnh sau:
ant Clean

Kết quả như sau:

Buildfile: build.xml
Clean:
[delete] Deleting 2 files from \blah\blah\build
[delete] Deleting \blah\blah\blah\build\AntDemo.class
[delete] Deleting \blah\blah\blah\build\image.jpeg
BUILD SUCCESSFUL
Total time: 1 second

Tiếp theo ta sẽ thực thi lệnh ant không cần tham số nào cả, do đó ant sẽ thực thi thẻ target được quy định trong thuộc tính default được nêu ở trên
Kết quả như sau:

Buildfile: build.xml
AboutPopup:
[echo] Doing AboutPopup
[javac] Compiling 1 source file to \blah\blah\blah\build
AboutControl:
[echo] Doing AboutControl
[javac] Compiling 1 source file to \blah\blah\blah\build
ExitControl:
[echo] Doing ExitControl
[javac] Compiling 1 source file to \blah\blah\blah\build
AntDemo:
[echo] Doing AntDemo
[copy] Copying 1 file to \blah\blah\blah\build
[javac] Compiling 1 source file to \blah\blah\blah\build
all:
[echo] Doing all
BUILD SUCCESSFUL
Total time: 4 seconds

Có thể thấy được các thẻ target được thực thi theo thứ tự được quy định bởi thuộc tính depends trong các thẻ target.

5.Nâng cao:
Để hỗ trợ cho việc điều khiển sự lưu thông (flow of control) của tiến trình, ant cung cấp cú pháp gọi những thẻ <target> khác bằng cú pháp sau:
<antcall target=”target-name”>
Giả sử ta muốn tiến trình thực hiện theo cú pháp trong Java như sau:

if( condition ) {
if( inner-condition ) {
A
} else {
B
}
} else {
C
}

Trong ant ta có thể viết như sau:

<?xml version="1.0"?>
<project name="Flow.Of.Control" default="nested-if" basedir=".">
<target name="nested-if">
<condition property="condition">
<available file="fileone"/>
</condition>
<antcall target="then"/>
<antcall target="else"/>
</target>
<target name="then" if="condition">
<echo>THEN BODY EXECUTED</echo>
<condition property="inner-condition">
<available file="filetwo"/>
</condition>
<antcall target="inner.then"/>
<antcall target="inner.else"/>
</target>
<target name="inner.then" if="inner-condition">
<echo>INNER THEN BODY EXECUTED</echo>
</target>
<target name="inner.else" unless="inner-condition">
<echo>INNER ELSE BODY EXECUTED</echo>
</target>
<target name="else" unless="condition">
<echo>ELSE BODY EXECUTED</echo>
</target>
</project>
Trong cú pháp trên, ta sử dụng thuộc tính if và unless để xét điều kiện, đầu tiên “nested-if” được gọi, nó sẽ kiểm tra xem tập tin có tên “fileone” có tồn tại hay không, nếu tồn tại thì biến condition sẽ được gán giá trị, sau đó gọi thẻ target “then” và thẻ target “else”. Khi thẻ target “then” được gọi, nó sẽ kiểm tra điều kiện thông qua biến property có tên là “condition”, nếu biến này được gán giá trị thì sẽ thực hiện các hành động trong thẻ target này. Trong thẻ target “then” lại xét xem tập tin “filetwo” có tồn tại hay không, nếu tồn tại thì biến inner-condition sẽ được gán giá trị, sau đó gọi thẻ target “inner.then” và thẻ target “inner.else”. Quá trình trên có thể được mô tả bằng sơ đồ sau:

Phụ lục A

Tham sốMô tả
-vHiển thị thông tin trong quá trình thực thi ant
-projecthelpHiển thị thông tin về các thẻ target hiện có trong tập tin build.xml

Phụ lục B

FileSet được dùng như một bộ lọc để chỉ ra những tập tin thoả mãn những điều kiện nào đó bằng cách dùng một hay nhiều mẫu được chỉ định. FileList là danh sách những tập tin thoả mãn điều kiện, FileSet dùng PatternSets và Patterns để định nghĩa những hành động cần thực hiện.
-dấu ? đại diện cho 1 kí tự bất kì
-dấu * đại diện cho nhiều kí tự bất kì hay không có kí tự nào cả
-dấu ** đại diện cho nhiều thư mục bất kì hay không có thư mục nào cả
Fileset phải chỉ định thư mục gốc (Base directory) thông qua thuộc tính dir, để từ đó tính toán các đường dẫn có liên quan.
<fileset dir="BASEDIR"/>
Hay:
<fileset dir="BASEDIR">
</fileset>
Ví du 1:
<fileset. dir="." includes="**/*.blah **/*.bleh"
Trong ví dụ trên, bao gồm tất cả các tập tin có đuôi là .blah hay .bleh trong thư mục hiện tại và trong các thư mục con của thư mục hiện tại.

Ví dụ 2:
<fileset. dir=".">
<include. name="**/*bl*"/>
<exclude name="**/blah/*"/>
</fileset>
Ta có thể viết cú pháp như trên để chỉ ra rằng sẽ bao gồm tất cả các tập tin có tên chứa chuỗi “bl” trong thư mục hiện tại và trong các thư mục con. Và sẽ loại bỏ những tập tin nằm trong thư mục có tên “blah” trong thư mục hiện tại hay trong các thư mục con. Chú ý rằng ta sử dụng thẻ <include> và thẻ <exclude> với thuộc tính name thay vì dùng thuộc tính includes và excludes trong thẻ <fileset>
Vậy khi ta cần dùng nhiều lần 1 mẫu (pattern) nào đó lại phải viết lại nhiều lần chăng, câu trả lời đó là dùng thẻ <patternset> với cú pháp sau:

<fileset dir=".">
<patternset id="blah">
<include name="**/*bl*"/>
<exclude name="**/blah/*"/>
</patternset>
</fileset>

Sau khi khai báo thuộc tính id của thẻ patternset, nếu sau này cần dùng đến ta chỉ cần tham chiếu đến thẻ patternset trên với cú pháp sau:
<fileset dir=".">
<patterset refid="blah"/>
</fileset>

Ta cũng có thể dùng thuộc tính if và unless trong thẻ include và exclude để đưa ra điều kiện thêm vào (include) hay bỏ đi (exclude).
Ví dụ 3:
<fileset dir=".">
<include name="**/extensions/*.java" if="version.professional"/>
</fileset>

Trong ví dụ này chỉ ra rằng sẽ bao gồm tất cả tập tin .java trong thư mục extensions nếu biến version.professional được gán giá trị bất kì.
Ví dụ 4:
<fileset dir=".">
<exclude name="chinese.lang" unless="language.chinese"/>
</fileset>

Trong ví dụ này sẽ loại bỏ tập tin chinese.lang nếu biến language.chinese không được gán giá trị nào cả.
Ngoài ra, nếu như giá trị của thuộc tính name của thẻ include hay exclude quá nhiều ta có thể tạo danh sách các tập tin trong một tập tin khác và tham chiếu đến tập tin đó bằng bằng thẻ <includesfile>,<excludesfile> với cú pháp sau:

<fileset dir=".">
<includesfile name="some.file"/>
</fileset>

Tập tin some.file có thể có nội dung như sau:
bl?h.bl?h
*.java
FileList: tương tự FileSet nhưng không hỗ trợ những kí tự đại diện ? và *. Ta phải liệt kê hết những tập tin ngăn cách nhau bởi dấu phẩy hay khoảng trắng trong thuộc tính files.Và ta cũng có thể đặt id và tham chiếu đến FileList đó thông qua thuộc tính refid như sau:
<filelist id="blah" dir="." files="blah.blah bleh.bleh"/>

Tham chiếu đến FileList:
<filelist refid="blah"/>



Read more >>

Tản mạng về Web 2.0

Thứ Ba, 1 tháng 12, 2009 0 nhận xét

Web truyền thống giống như một nhà hàng với menu có sẵn, còn web 2.0 giống như một cái bếp tập thể, mọi người có thể vào đó tự nấu các món ăn và tự chia sẻ. Vì môi trường web 2.0 rất cởi mở nên cũng rất khó để kiểm soát các nguy cơ



Read more >>

Brainstorming-kỹ thuật tạo ra ý tưởng

Thứ Bảy, 24 tháng 5, 2008 0 nhận xét


Brainstorming (Tấn công não) là một kỹ thuật tạo ra ý tưởng trong công việc làm việc theo nhóm. Kỹ thuật này được sáng tạo từ năm 1957, nhằm giải quyết các vấn đề. Nó được miêu tả trong cuốn sách Applied Imagination do Alex F. Osborn, một nhà quản trị quảng cáo.

Brainstorming được sử dụng trong các công việc sau đây

· Phát triển sản phẩm mới
· Quảng cáo
· Giải quyết vấn đề
· Quá trình quản trị
· Quản trị dự án
· Xây dựng nhóm
· Xây dựng kế hoạch kinh doanh

Chỉ với các vấn đề trên các bạn đã thấy tầm quan trọng của brainstorming có ý nghĩa rất lớn trong các công việc hàng ngày của chúng ta, quan trọng với các công việc của doanh nghiệp, các dự án.

Quy trình brainstorming có các yêu cầu như sau

- Có một nhóm làm việc, để thực hiện brainstorming bạn cần có 1 nhóm từ 3 người trở lên, trong đó có 1 người đứng đầu điều hành cuộc làm việc, có một thư ký của nhóm ghi chép các ý kiến, đóng góp của thành viên

- Các thành viên đều có quyền bình đằng, không bị phân biệt bởi một bên nào, không bị tước quyền phát biểu, cho ý kiến.

Quy trình giản đơn

  • Đưa ra các vấn đề
  • Giải quyết vấn đề
  • Lựa chọn các phương án giải quyết

- Người chủ trì cuộc họp sẽ đưa ra các vấn đề cho nhóm thảo luận

- Các thành viên sẽ thảo luận, đưa ra các cách giải quyết, các giải pháp, các ý tưởng mới để giải quyết vấn đề. Tất cả các ý kiến đưa ra đều được thảo luận để phản biện, bảo vệ…

- Buổi thảo luận kết thúc khi các vấn đề đã được thảo luận hết, các thông tin được trao đổi đã ở mức bão hóa và người chủ trì cuộc họp sẽ tổng kết các giải pháp , đưa ra những giải pháp tối ưu nhất và lấy lựa chọn từ nhóm. Các phương án lựa chọn đòi hỏi phải được sự nhất trí cao của nhóm.

Các trình tự phức tạp hơn của kỹ thuật brainstorming các bạn có thể tham khảo trên mạng internet. Các bạn có thể tham khảo trực tiếp ở đường dẫn sau

http://en.wikipedia.org/wiki/Brainstorming

Đối với các bạn trẻ khi khởi nghiệp thì nên tập cách làm việc theo nhóm. Bạn có thể trực tiếp điều hành cuộc họp hoặc nhờ một người có kinh nghiệm, kiến thức để điều hành cuộc họp.

Bạn sẽ đưa ra những vấn đề hoặc ý tưởng của bạn để mọi người thảo luận, mọi người sẽ đưa ra những các giải quyết, các phương án thực hiện, các ý tưởng mới hơn để giúp bạn có thể đúc kết và tích lũy những ý kiến, ý tưởng.



Read more >>

Nhận xét mới

Số người Online

website counter

Latest Blog Posts