Tuesday, February 20, 2007

Ruby's DSL implementation pattern

DSLs are designed to solve a particular kind of problem. Implementation DSLs as internal DSLs in Ruby is getting popular. Jim Freeze in his article Creating DSLs with Ruby use "Interpret" pattern to implement DSL. According the article a problem will be solved by using instance of a Class Machine. The Machine has class method load that create an instance of the Class Machine and load a file containing machine's instructions writen in DSL. The Machine also has instance method process, that run loaded instructions with specified data. A Ruby implementation can be as follow
class Machine
  def self.load(filename)
    machine = Machine.new
    machine.instance_eval(File.read(filename), 
      filename)
    machine
  end

  def process(*arg)
  #...
  end
end
Using this pattern, in The ruby implementation of an example in Martin Fowler's Language Workbenches article the Reader class can be modified as follows
class Reader
    #...

    def self.load dsl_file_name
        reader = Reader.new
        reader.instance_eval(File.read(dsl_file_name), 
          dsl_file_name)
        reader
    end

    def process data_file_name
        File.open(data_file_name,'r') do |file|
            while line = file.gets
                process_line line
            end
        end
    end

    #...

    def mapping type_code, type, &block
        @strategies[type_code] =
            ReaderStrategy.new type_code, type, &block
    end

end
#dsl.txt
mapping('SVCL', ServiceCall) do
  extract 4..18, 'customer_name'
  extract 19..23, 'customer_ID'
  extract 24..27, 'call_type_code'
  extract 28..35, 'date_of_call_string'
end
mapping('USGE', Usage) do
  extract 9..22, 'customer_name'
  extract 4..8, 'customer_ID'
  extract 30..30, 'cycle'
  extract 31..36, 'read_date'
end
#load_dsl.rb
require 'test/unit'
require File.join(File.dirname(__FILE__),
    '..', 'lib', 'data')
require File.join(File.dirname(__FILE__),
    '..', 'lib', 'data_reader')
require File.join(File.dirname(__FILE__),
    '..', 'lib', 'data_reader_strategy')
class TestLoadDsl < Test::Unit::TestCase
    def test_read_file_load_dsl
        dsl_file_name =  File.join(File.dirname(__FILE__),
            'dsl.txt')
        reader = Reader.load dsl_file_name

        data_file_name = File.join(File.dirname(__FILE__),
            'sample.txt')
        reader.process data_file_name

        assert_equal 4, reader.result.size
    end
end

Monday, February 19, 2007

Ruby and DSL

Googling on Internet, I found few interested sources of information of how to implements DSL on top of Ruby language.
Creating DSLs with Ruby
The Way of Meta
Writing Domain Specific Languages

Sunday, February 18, 2007

ERP Application Service Providers

During Tet Holiday, I have time to read the Friedman's Book "The World Is Flat: A Brief History of the Twenty-first Century " that is given to me by a friend. One chaper of the book mention about Salesforce, a company that provides CRM software as service via Internet at very low cost. (Software as a Service) SaaS is not new, the idea rooted from 60, 70 year of last century under different name such as service bureau, utilities computing, etc. I think, using ERP as service is very attractive for small, mid-size companies. Searching on Google, I found the following companies (ASP) offering ERP sofware as service 24SevenOffice NetSuite SalesForce TwinField Oracle CRM On Demand RightNow Technologies Fee of service is different from company to company ranging from 40 to 100 USD per user per month.

Saturday, February 17, 2007

White Paper về ngành CNTT Việt Nam của GS TS John Vũ

Một người bạn gửi cho Tôi tài liệu nhan đề "Ngành CNTT Việt Nam phải làm gì để thành công trên thị trường thế giới?" của John Vũ. Do đây là chủ đề được nhiều người từ các nhà hoạch định chính sách, các nhà đầu tư, các nhà quản lý, cho đến các kỹ sư phần mềm quan tâm, Tôi đưa nguyên văn dưới đây để mọi người tham khảo.

Hội Tin Học TP.HCM (HCA) nhận được nội dung Bạch Thư (White Paper) về ngành công nghiệp CNTT Việt Nam của GS. TS John Vũ - Viện sĩ Viện Hàn Lâm Software Engineering Institute (SEI) thuộc Carnegie Mellon University (CMU); Kỹ sư Trưởng Trung Tâm CNTT của Tập Đoàn Boeing. Qua nội dung của Bạch Thư, người đọc không chỉ tiếp thu thông điệp từ Boeing về những khuyến nghị mà ngành công nghiệp CNTT Việt Nam cần thực hiện mà còn cảm nhận được tình cảm của một trong những chuyên gia Việt Kiều CNTT hàng đầu thề giới gởi đến cộng đồng CNTT Việt Nam, để cùng suy nghĩ cho một ước mơ sử dụng CNTT đưa đất nước vượt thoát đói nghèo, nắm bắt được thời cơ lịch sử của CNTT Việt nam trong bối cảnh cạnh tranh toàn cầu. Hội Tin Học TP.HCM (HCA) tạm dịch nội dung của Bạch Thư và mong nhận được những ý kiến trao đổi của các Anh Chị chuyên gia và doanh nghiệp trong cộng đồng CNTT Việt Nam:
Ngành CNTT Việt Nam phải làm gì để thành công trên thị trường thế giới?
Bạch Thư
Người thực hiện: John Vu – Viện sĩ Viện Hàn Lâm - Carnegie Mellon Univeristy-CMU; Kỹ sư trưởng TT CNTT tập đoàn Boeing 09/2006 Dựa trên những thông tin được cung cấp bởi Hội Tin học TP.HCM (HCA), trang web của rất nhiều công ty cũng như những trao đổi với các lãnh đạo doanh nghiệp CNTT trong suốt chuyến đi Việt Nam, tôi đã thực hiện báo cáo này, đưa ra một cái nhìn tổng quát về ngành CNTT Việt Nam. Dựa trên những kinh nghiệm mà tôi đã trải nghiệm tại Ấn Độ, Trung Quốc, Nam Triều Tiên và Châu Âu, tôi đã đúc kết được một vài vấn đề then chốt nhằm giúp Việt Nam thành công trên lĩnh vực CNTT toàn cầu. Tuy nhiên, báo cáo này cũng chỉ là những quan sát và nhận xét chủ quan của riêng cá nhân tôi, còn nhiều thiếu sót do không đủ thời gian và nỗ lực để thu thập đầy đủ dữ liệu và các thông tin quan trọng. Xét về khía cạnh nào đó, tôi tin chắc rằng báo cáo này có thể giúp Việt Nam tạo ra những lối đi riêng trong việc tập trung vào một vài hoạt động trong năm đầu tiên; tuy nhiên, những hành động có tính chất toàn diện của các khuyến nghị là cần thiết để làm thay đổi ngành công nghiệp CNTT Việt Nam và cho phép tham gia kinh doanh toàn cầu.
1) Quy mô là một vấn đề:
Hầu hết các công ty CNTT tại Việt Nam đều là công ty nhỏ (số nhân sự dưới 50 người). Đây chính là nguyên nhân gây ra những khó khăn, cản trở trong việc hội nhập với thế giới. Nếu nhân sự của công ty bạn đủ mạnh, các đối tác nước ngoài sẽ tin rằng họ đang hợp tác với một công ty đủ sức đương đầu với những rủi ro, luôn có đội ngũ nhân viên chuyên nghiệp, có thể thực hiện được những mong muốn của họ và dĩ nhiên, họ sẽ giữ mối quan hệ hợp tác lâu dài với công ty bạn. Ngoài việc liên doanh và sát nhập, một giải pháp khác là thành lập một liên kết chặt chẽ giữa một số công ty CNTT nhưng vẫn giữ tính cách độc lập của các thành viên (consortium), bao gồm những công ty nhỏ để tập trung nguồn nhân lực cùng thực hiện các dự án chung. Lãnh đạo của consortium (có thể là Khu Công nghệ (CN) Cao sẽ đóng vai trò là nhà đại diện để giao dịch với khách hàng. Consortium có một thực thể pháp l‎ý riêng và tiếp cận thị trường qua một thương hiệu riêng. Dĩ nhiên, các công ty CNTT trong consortium phải có khả năng làm việc độc lập và hiệu quả để tối thiểu hoá những rủi ro cho khách hàng. Để không ngừng phát triển và mở rộng thị trường quốc tế, doanh nghiệp CNTT tại Việt Nam phải chuyển đổi hình thức “kinh doanh gia đình” sang hình thức hoạt động chuyên nghiệp và cần tập trung vào những thị phần chuyên biệt. Mặt khác, các doanh nghiệp cần cải tiến quy trình quản l‎ý, đặc biệt là việc lập các báo cáo tài chính và tín dụng. Không có một hệ thống quản l‎ý và tài chính tốt, doanh nghiệp Việt Nam rất khó mà có được chỗ đứng trong thị trường quốc tế. Hơn nữa, doanh nghiệp Việt Nam cũng cần nắm rõ những thị trường tiềm năng, nắm bắt thị hiếu đối tác và đầu tư vào lĩnh vực nghiên cứu và phát triển (R&D) để đủ sức cạnh tranh với các đối thủ.
Khuyến nghị:
• Nghiên cứu kỹ lưỡng về khả năng tạo ra một consortium CNTT thông qua Khu CN cao. Khu CN cao đóng vai trò như một thực thể pháp lý độc lập trong việc thương thảo với đối tác.
• Để làm việc quốc tế, ta nên tạo ra thương hiệu chung giữa 20-30 công ty nhỏ hơn là các công ty cá thể.
• Đầu tư vào lĩnh vực R&D để nhận biết những sở trường chủ yếu của ngành công nghiệp CNTT và phát triển các cơ hội tương lai.
• Tập trung vào việc cải tiến cơ cấu quản lý, tài chính, kế toán và cơ sở hạ tầng để nâng tầm kinh doanh toàn cầu.
• Nghiên cứu xu hướng thị trường để xác định và triển khai những thị phần chuyên biệt trước khi phát triển theo diện rộng.
• Tăng cường hoạt động tiếp thị để xây dựng hình ảnh một Việt Nam thực sự là một địa điểm kinh doanh.
• Đề nghị sự hỗ trợ chuyên môn từ Boeing để nhận diện môi trường kinh doanh CNTT hiện nay và nắm bắt những cơ hội trong tương lai.
2) Dịch vụ là một vấn đề:
Dựa trên “Báo cáo Toàn cảnh CNTT-TT Việt Nam” của Hội Tin học TP.HCM (HCA), ngành công nghiêp CNTT Việt nam dường như tập trung nhiều vào các hoạt động như lắp ráp máy tính, kinh doanh phần cứng và cung cấp các dịch vụ internet. Đây là những lĩnh vực có tính không ổn định rất cao do sự cạnh tranh từ các doanh nghiệp được tổ chức tốt như Lenovo, IBM, Dell, HP and AOL, đặc biệt là khi Việt Nam gia nhập Tổ chức Thương mại Thế giới (WTO). Sẽ tốt hơn và có nhiều lợi ích hơn nếu ngành công nghiệp CNTT Việt Nam tập trung vào ngành công nghiệp dịch vụ; như gia công phần mềm, gia công dịch vụ trong qui trình quản lý (Business Process Outsourcing - BPO) và gia công lưu trữ dữ liệu thông tin (Media Storage Outsourcing - MSO) là những lĩnh vực có thể sinh lợi rất nhiều cũng như tạo ra nhiều cơ hội việc làm hơn là ngành công nghiệp sản phẩm hiện nay.
Ngành công nghiệp gia công phần mềm Việt Nam vẫn còn rất non trẻ với nhiều công ty chỉ tập trung vào một phần nhỏ trong chu trình phát triển phần mềm như nhập liệu, testing và mã hóa, trong khi có rất ít doanh nghiệp thể hiện năng lực phát triển ứng dụng, quản trị dự án, kiến trúc hệ thống, tích hợp hệ thống, quản trị cơ sở dữ liệu hoặc phân tích quy trình kinh doanh. Nguyên nhân cũng có thể là do hệ thống giáo dục hiện nay vẫn còn ảnh hưởng từ truyền thống Đông Âu – chuyên về đào tạo lập trình hơn là phân tích, thiết kế và phát triển các ứng dụng, các kỹ năng quản l‎ý vốn là thế mạnh của truyền thống đào tạo giảng dạy tại Mỹ.
Khuyến nghị:
• Tiếp thu cách tiếp cận mới về phát triển phần mềm và tập trung vào toàn bộ chu trình phát triển sản phẩm thay vì chỉ triển khai một phần nhỏ trong chu trình.
• Chuyển ngành CNTT Việt Nam từ khuynh hướng nghiêng về sản phẩm sang khuynh hướng nghiêng về dịch vụ.
• Xây dựng kế hoạch quôc gia, hoặt ít nhất là kế hoạch vùng để tập trung vào công nghiệp gia công.
• Hợp tác với các trường đại học nhằm đào tạo nhiều hơn nữa nguồn nhân lực tập trung vào quy trình phần mềm tổng thể và một số kỹ năng chuyên biệt hiện đang thiếu hụt trên thế giới hiện nay.
• Đề nghị sự hỗ trợ về chuyên môn của Boeing nhằm nhận thức đầy đủ về công nghiệp gia công CNTT và nắm bắt được các cơ hội thị trường.
3)Năng lực là một vấn đề:
Có một sự cường điệu khi giới thiệu ưu thế của ngành CNTT Việt Nam là chi phí nhân công thấp trong việc thay thế Ấn Độ và Trung Quốc trong thị trường CNTT thế giới. Ngay cả khi có một giá nhân công thấp hơn, thì nếu chỉ có giá thấp cũng không tạo ra một yếu tố chính cho sự lựa chọn của đối tác. Nhận được đơn hàng mới chỉ là giai đoạn ban đầu trong khi tạo được sự hài lòng cho khách hàng mới là tất cả công việc. Nếu khách hàng nhận ra việc thiếu năng lực của mình thì rất khó giữ được sự hợp tác lâu dài. Hầu hết các doanh nghiệp trên thế giới đều rất cẩn trọng trong việc chọn lựa nhà cung ứng thông qua hệ thống tiêu chuẩn chọn lựa khắt khe có được từ những kinh nghiệm tại những thị trường đã được định hình như Ấn Độ.
Tôi thiết tha khuyến cáo các doanh nghiệp CNTT tại Việt nam nên xác định vị thế của mình dựa trên năng lực chuyên môn hơn là chỉ dựa vào giá thấp. Năng lực chỉ được công nhận dựa trên một hệ thống giáo dục và đào tạo tiên tiến; điều này cần rất nhiều thời gian và công sức. Sự phóng đại năng lực chỉ làm tăng tỉ lệ thất bại hoặc đưa đến những dự án không đạt yêu cầu trong mắt của đối tác. Điều này làm cho chúng ta đánh mất sự tín nhiệm và mất cả những cơ hội hợp tác tiếp theo. Tốt hơn cả là nên bắt đầu bằng năng lực thực sự và xây dựng sự tín nhiệm nơi khách hàng, khi đã tạo nên mối quan hệ tốt và năng lực đã vững vàng thì việc kinh doanh sẽ phát triển nhanh chóng.
Khuyến nghị:
• Đặt kế hoạch phát triển kỹ năng nghiệp vụ hơn là cách đưa ra giá thấp.
• Hợp tác với các trường đại học để đào tạo các kỹ năng như bảo mật, khai thác dữ liệu, quản l‎ý dự án, kiến trúc phần mềm, tích hợp hệ thống v.v…
• Tập trung vào việc cải tiến kỹ năng và năng lực cũng như xác định những kẽ hở thị trường mà Việt Nam có thể chiếm lĩnh trong hiện tại và tương lai.
• Xây dựng mối quan hệ tốt với khách hàng qua việc thực hiện công việc hơn là giá thấp.
• Phân tích thị trường nhằm nhận diện các khả năng phát triển.
• Đề nghị sự hỗ trợ của Boeing trong việc cải tiến giáo dục và đào tạo.
4) Vấn đề về trình độ quản lý vững vàng và việc đạt được chính thức chứng chỉ chất lượng quản lý :
Các khách hàng quốc tế trông đợi nhiều vào trình độ quản lý và chất lượng công việc từ các nhà gia công CNTT. Ấn Độ là quốc gia gia công chiếm lĩnh được vị trí hàng đầu, Việt nam cũng nên đạt đến vị trí của các công ty Ấn độ hoặc sẽ trở thành nhà cung cấp hạng hai hay hạng ba, chỉ nhận được các công việc có lợi nhuận thấp như nhập liệu hoặc thử nghiệm phần mềm.
Chứng chỉ quản lý chất lượng CMMI (Capability Maturity Model Integrated) được phát triển bởi Viện Công Nghệ Phần Mềm (Software Engineering Institute - SEI) của Carnegie Mellon University (CMU), được chấp nhận bởi khách hàng trên toàn thế giới như một tiêu chuẩn bảo đảm cho chất lượng phát triển phần mềm. Các công ty Việt Nam cần đạt được các trình độ cao của CMMI (cấp 4 và 5).
Đối với các khách hàng quốc tế, việc tìm kiếm các nhà cung cấp mới đem đến nhiều rủi ro, nhiều người trong số họ không thích có thêm những nhà cung cấp mới. Một chứng chỉ quản lý chất lượng được công nhận bởi một cơ quan chứng thực độc lập giúp họ giảm bớt những rủi ro. Có được chứng chỉ chính thức CMMI là điểm tạo sự khác biệt chính trong hoạt động gia công phần mềm. Để cạnh tranh toàn cầu, tất cả các doanh nghiệp CNTT Việt Nam cần phải đạt được chứng chỉ CMMI từ các nguồn được công nhận.
Hiện nay, có nhiều chứng chỉ chất lượng “giống CMMI” được cấp bởi những nhà tư vấn ở một số quốc gia nhưng không được tổ chức quốc tế chính thức công nhận. Việc nhận các chứng chỉ như vậy có thể gây ra sự nhầm lẫn đem đến sự tổn hại về uy tín của doanh nghiệp Việt Nam. Chứng chỉ CMMI của Mỹ đòi hỏi sự chứng thực của cơ quan đánh giá được SEI uỷ nhiệm hợp pháp. Danh sách các đơn vị được cấp chứng chỉ CMMI được SEI công bố để bảo đảm tính hợp pháp của qui trình chứng thực. Hầu hết khách hàng quốc tế đều tham khảo danh sách cấp chứng chỉ CMMI của SEI để thẩm định tính xác thực về chứng chỉ CMMI của những ứng viên cung cấp dịch vụ gia công cho họ.
Khuyến nghị:
• Các công ty CNTT Việt Nam nên nhanh chóng đạt được chứng chỉ CMMI từ nguồn chính thức.
• Dự trù ngân sách cho việc đạt chứng chỉ CMMI.
• Tạo sự đồng thuận trong tất cả nhân viên xem việc cam kết chất lượng là phương cách kinh doanh.
• Tập trung vào chất lượng và hiệu quả để tạo nên điểm khác biệt của doanh nghiệp.
• Quảng bá kết quả của việc nhận chứng chỉ CMMI như là một phần việc marketing.
• Đề nghị sự hỗ trợ của Boeing trong việc đào tạo và cấp chứng chỉ CMMI.
5. Vấn đề thử thách mới, kỹ năng mới: Là một thử thách rất lớn cho Việt Nam khi đối mặt với những đối thủ hàng đầu như Trung Quốc, Ấn Độ. Tuy vậy, với việc đào tạo đúng và tiếp cận tốt, CNTT Việt Nam có thể cạnh tranh trực tiếp với những đối thủ lớn này trong thị trường toàn cầu. Việt Nam có những ưu và nhược điểm riêng; nên tập trung vào những gì mình làm được hơn là theo những việc mà Trung Quốc và Ấn Độ đang làm. Để có thể chiến thắng nên thay đổi quan điểm như chi phí thấp và khả năng cao.
Hiện nay cả Trung Quốc và Ấn Đô đều bị ảnh hưởng của việc thiếu hụt trầm trọng nguồn nhân lực kỹ năng cao và họ cố gắng giải quyết vấn đề bằng cách đào tạo ồ ạt số lượng lớn người làm CNTT. Điều này dẫn đến việc giảm chất lượng của nguồn nhân lực. Đây là cơ hội tốt cho Việt Nam để cạnh tranh bằng cách cung cấp nguồn nhân lực kỹ năng cao qua những chương trình giáo dục và dạy nghề nghiêm chỉnh.
Ngành công nghiệp CNTT thay đổi nhanh chóng, việc hiểu rõ tiến trình và xu hướng phát triển sẽ giúp Việt Nam điều chỉnh hướng đi và tái họach định để bảo đảm kẽ hở thị trường hơn là đi theo những việc người khác đã làm. Xu hướng hiện nay xem trọng giá trị công việc và mối quan hệ hơn là nguồn nhân lực giá rẻ. Hầu hết các phần mềm đang trở thành hệ thống hội tụ mạng lưới, ngày càng phức tạp; đòi hỏi những kỹ năng thành thạo về cấu trúc hệ thống, thiết kế, tích hợp hơn là lập trình hay testing. Khuynh hướng này không có nghĩa là sẽ không còn việc cung ứng nhân lực giá rẻ nhưng ngành công nghiệp ngày càng mở ra nhiều cơ hội cho những quốc gia nào có thể cung cấp được những kỹ năng mới cho khách hàng.
Khuyến nghị:
• Tiến hành nghiên cứu thị trường để nhận diện những kỹ năng, những khả năng mới - đặc biệt tránh những kỹ năng thông thường như lập trình, testing mà nước nào cũng có …
• Thu thập và phát triển những chương trình đào tạo các kỹ năng chuyên sâu - đặc biệt trong quản lý dự án, phân tích yêu cầu kinh doanh, kiến trúc hệ thống, tích hợp hệ thống, quản trị toàn bộ, thiết kế, xây dựng hệ thống…
• Đào tạo những kỹ năng mới cho nhân viên.
• Đề nghị Boeing hỗ trợ các chương trình đào tạo kỹ năng mới từ các trường đại học Mỹ.
6. Vấn đề truyền thông:
Kinh doanh toàn cầu cần kỹ năng giao tiếp trong nhiều ngôn ngữ nhưng tiếng Anh vẫn quan trọng nhất. Doanh nghiệp CNTT Việt Nam cần đào tạo nhân viên về giao tiếp tiếng Anh và hiểu về văn hóa của khách hàng đối với từng nước.
Để giải quyết vấn đề này, cần đến sự trợ giúp của ngoại kiều hoặc của Việt kiều làm người đại diện. Trong môi trường kinh doanh toàn cầu, nên có bộ phận quản lý tại chỗ gồm những người am hiểu văn hóa và tập quán kinh doanh bản địa. Ước tính có khoảng một triệu người Việt Nam tại nước ngoài có khả năng như vậy. Cộng đồng này hầu hết có thể nói hai ngôn ngữ và thường hiểu văn hóa thị trường nơi mà họ lớn lên.
Khuyến nghị:
• Thu thập những chương trình dạy Anh văn cho nhân viên CNTT.
• Thuê nhân viên địa phương hoặc Việt kiều làm đại diện ở mỗi thị trường.
• Tập trung vào việc hiểu rõ văn hóa kinh doanh của khách hàng.
• Thu thập các chương trình đào tạo Anh ngữ cho các khu công nghiệp kỹ thuật cao và các trường đại học.
• Đề nghị Boeing hỗ trợ việc hợp tác với các Học viện và trường đại học Mỹ.
7) Vấn đề về đối tác và liên minh:
Tất cả những công ty CNTT thành công đều có đối tác tại những lĩnh vực nằm ngoài khả năng của họ. Các công ty CNTT Việt Nam cần liên kết với những đối tác khác và tạo ra những liên minh hoạt động trong những lĩnh vực nhất đinh nhằm xác định thị trường theo ngành dọc. Những doanh nghiệp Việt Nam nên giao cho các đơn vị khác cung ứng cho mình những dịch vụ bên ngoài dịch vụ chính và hình thành các mối quan hệ tin cậy với khách hàng. Khu công nghiệp cao có thể là nơi được cân nhắc trước tiên để tạo lập mối quan hệ đối tác hoặc liên minh lẫn nhau. Một cách cơ bản là một thực thể liên kết nhiều công ty sẽ tạo nên một sức mạnh lớn trong thị truờng cạnh tranh gay gắt hiện nay.
Khuyến nghị:
• Thăm dò khả năng thành lập mối quan hệ đối tác và liên minh.
• Hình thành thực thể liên kết consortium lớn để quản lý toàn bộ chu trình hoạt động.
• Nghiên cứu các chủ trương chính sách nhà nước các cấp để xúc tiến thành lập consortium.
• Xác định, kết nối và đo lường những giá trị gia tăng của từng liên minh.
• Hợp thức hoá việc uỷ quyền cho Khu công nghiệp cao như một thực thể đại diện và thương hiệu duy nhất.
• Đề nghị Boeing hỗ trợ xây dựng thương hiệu cho Khu Công nghệ cao.
• Đề nghị Boeing hỗ trợ việc đào tạo cho các nhà quản lý Khu Công nghệ cao từ các trường Đại học và các trung tâm đào tạo ở Mỹ.
8) Vấn đề tiếp thị và quảng cáo: Cho dù là ngành công nghiệp CNTT Việt nam phát triển rất nhanh trong vài năm qua, nhưng hầu như tình hình này chưa được biết đến trên bình diện kinh doanh toàn cầu. Nếu khách hàng không biết gì về Việt Nam thì tại sao họ phải làm kinh doanh tại đây? Điều quan trọng bây giờ là Việt Nam cần nỗ lực sử dụng các chiến dịch kinh doanh để chào hàng cho được “CNTT Việt Nam”. Rất khó cạnh tranh với các đối thủ được tổ chức tốt như Ấn Độ, Trung Quốc . Nếu chỉ có giá thấp thì sẽ nhận được rất ít đề nghị có giá trị. Hiện nay hầu hết các doanh nghiệp phương tây giao gia công không coi vấn đề chi phí là chuyện chính yếu mà họ đang tìm kiếm những nguồn cung ứng các dịch vụ có giá trị như hệ chuyên gia và tiếp cận thị trường địa phương.
Khuyến nghị: Việt Nam cần xác định vị trí của ngành công nghiệp CNTT vào:
* chất lượng và hiệu quả (được chứng nhận bởi tiêu chuẩn CMMI).
* cơ sở hạ tầng ổn định để có thể chuyển giao các dịch vụ cho khách hàng nhanh hơn, tốt hơn và đáng tin cậy hơn.
* xây dựng các kỹ năng chuyên biệt.
* đầu tư phù hợp cho hạ tầng để có thể kinh doanh tốt.
* thân cận với các thị trường Châu Á Thái Bình Dương.
* bảo đảm sự ổn định chính trị và an ninh xã hội.
* thu hút doanh nhân và khách du lịch đến Việt nam.
Kết luận:
Những thông tin trong bạch thư này được tôi thu nhận trong chuyến công tác vừa qua ở Việt Nam, có tính chất chủ quan hơn là dựa trên số liệu nghiên cứu khách quan. Tôi tin chắc rằng ngành công nghiệp CNTT Việt Nam cần nghiên cứu rộng hơn và hành động. Những khuyến nghị của tôi giới hạn trong phạm vi quan sát cá nhân với nhận thức đây chỉ là những hỗ trợ ban đầu của Boeing giúp Việt Nam cải thiện hệ thống giáo dục để xây dựng ngành khoa học không gian và ngành CNTT - TT mạnh mẽ; được nhận biết trên thị trường quốc tế và có khả năng cạnh tranh toàn cầu.
(Nguồn: HCA)

Thursday, February 15, 2007

Chúc mừng năm mới Đinh Hợi

Bức tranh Hoa Đào (Peach Blossom) này là của họa sĩ đương đại Trung Quốc DU YINGQIANG.

Tuesday, February 13, 2007

Convert Proc object to a block

Ruby methods like yield or instance_eval accept only block not Proc object. In order to use instance_eval in inner method, we need to convert Proc to block, the syntax is pretty simple just precede Proc object with ampersand.
def m1 &block
  m2 &block
end

def m2 
 yield
end

m1 {puts "hello"} # hello

a = Proc.new {puts "world"}

m2 &a # world

def m3 block
  instance_eval &block
end

m3 a # world

Sunday, February 11, 2007

The ruby implementation of an example in Martin Fowler's Language Workbenches article

It take me 3 hours to figure out how to implement in ruby the example described in Language Workbenches. It is one of my effort to learn the ruby language. The implementation uses what Jamis Buck's in the article Writing Domain Specific Languages called Sandboxing Approach.
#file ./lib/data.rb
class ServiceCall
    attr_accessor :customer_name,:customer_ID,
          :call_type_code,:date_of_call_string
end
class Usage
    attr_accessor :customer_name,:customer_ID,
          :cycle,:read_date
end
#file ./lib/data_reader.rb
class Reader
    attr_accessor :result

    def initialize
        @result = []
        @strategies = {}
    end

    def process file_name
        File.open(file_name,'r') do |file|
            while line = file.gets
                process_line line
            end
        end
    end

    def process_line line
        return if is_blank(line) || is_comment(line)
        type_code = get_type_code(line)
        strategy = @strategies[type_code]
        msg_err = <<-END
            unable to find strategy for
            type_code #{type_code}
        END
        raise msg_err if nil==strategy
        @result << strategy.process(line)
    end

    def is_blank line
        line == ''
    end

    def is_comment line
        line[0..0] == '#'
    end

    def get_type_code line
        line[0..3]
    end

    def mapping type_code, type, &block
        @strategies[type_code] =
            ReaderStrategy.new type_code, type, &block
    end

end
#file ./lib/data_reader_strategy.rb
class ReaderStrategy
    attr_accessor :extractors
    
    def initialize type_code, type, &block
        @type_code, @type = type_code, type
        @extractors = []
        instance_eval &block if block_given?
    end

    def process line
        result = @type.new
        @extractors.each do |e|
            e.extract_field result, line
        end
        result
    end

    def extract from_to, field_name
        @extractors << FieldExtractor.new(from_to,
            field_name)
    end

end

class FieldExtractor
    attr_accessor :from_to, :field_name

    def initialize from_to, field_name
        @from_to, @field_name = from_to, field_name
    end

    def extract_field target, line
        target.instance_variable_set(inst_var_sym,
            line[@from_to])
    end

    def inst_var_sym
        result = '@' + @field_name
        result.to_sym
    end
end
#file ./test/sample.txt
#123456789012345678901234567890123456789012345678901234567890
SVCLFOWLER         10101MS0120050313.........................
SVCLHOHPE          10201DX0320050315........................
SVCLTWO           x10301MRP220050329..............................
USGE10301TWO          x50214..7050329...............................
#file ./test/test_data_reader.rb
require 'test/unit'
require File.join(File.dirname(__FILE__),
    '..', 'lib', 'data')
require File.join(File.dirname(__FILE__),
    '..', 'lib', 'data_reader')
require File.join(File.dirname(__FILE__),
    '..', 'lib', 'data_reader_strategy')
class TestReader < Test::Unit::TestCase
    def setup
        @reader = Reader.new()
    end

    def test_read_file
        @reader.mapping('SVCL', ServiceCall) do
            extract 4..18, 'customer_name'
            extract 19..23, 'customer_ID'
            extract 24..27, 'call_type_code'
            extract 28..35, 'date_of_call_string'
        end
        @reader.mapping('USGE', Usage) do
            extract 9..22, 'customer_name'
            extract 4..8, 'customer_ID'
            extract 30..30, 'cycle'
            extract 31..36, 'read_date'
        end

        file_name = File.join(File.dirname(__FILE__),
            'sample.txt')
        @reader.process(file_name)
        assert_equal 4, @reader.result.size
    end

    def test_is_blank
        assert @reader.is_blank('')
    end

    def test_is_comment
        assert @reader.is_comment('#1234')
    end

    def test_get_type_code
        @reader.mapping('SVCL', ServiceCall)
        assert_equal 'SVCL',
            @reader.get_type_code('SVCLFOWLER')
    end
end
#file ./test/test_data_reader_strategy.rb
require 'test/unit'
require File.join(File.dirname(__FILE__),
    '..', 'lib', 'data')
require File.join(File.dirname(__FILE__),
    '..', 'lib', 'data_reader_strategy')
class TestReaderStrategy < Test::Unit::TestCase
    def test_service_call
        strategy =  ReaderStrategy.new 'SVCL',
        ServiceCall do
            extract 4..18, 'customer_name'
        end
        assert_equal 1, strategy.extractors.size

        result = strategy.process('SVCLFOWLER')
        assert_equal ServiceCall, result.class
        assert_equal 'FOWLER', result.customer_name
    end

    def test_usage_call
        strategy =  ReaderStrategy.new 'USGE',
        Usage do
            extract 9..22, 'customer_name'
        end
        assert_equal 1, strategy.extractors.size

        result = strategy.process('USGE10301TWO')
        assert_equal Usage, result.class
        assert_equal 'TWO', result.customer_name
    end

end