Một số lời khuyên cho người học IT

Kế hoạch của bạn là gì?

Bạn vẫn chưa có kế hoạch gì ư? Vậy thì đó là điều cần làm đầu tiên. Có một kế hoạch, bạn sẽ biết cần làm gì, những gì đã làm đã đúng với mong muốn hay chưa, và quan trọng nhất, bạn biết sau khi hoàn thành bạn sẽ đạt được gì.

Bạn có thể có các kế hoạch ngắn hạn và dài hạn. Các kế hoạch dài hạn có thể cho 5 năm, 10 năm hay 15 năm, và các kế hoạch ngắn hạn – với mục tiêu hoàn thành một bước nào đó trong kế hoạch dài hạn, có thể kéo dài từ vài ngày đến vào tháng. Và kết quả của chúng phải cụ thể, ví dụ: thành thạo C++, lấy được chứng chỉ CCNA, hay kiếm được thu nhập 10.000.000/tháng… có như vậy, bạn mới biết được chính xác mình có bám theo đúng mục tiêu hay chưa, và đã đạt được bao nhiêu % công việc, cũng như cần điều chỉnh gì để hoàn thành công việc đó đúng hạn.

Sau khi đã có kế hoạch, hãy cố gắng bám sát nó.

Sử dụng thời gian một cách tốt nhất

Những người khác mất bao nhiêu lâu để làm việc đó? Tôi không biết, nhưng tôi muốn bạn phải hoàn thành nó với một nửa thời gian đó thôi.

Khi còn dạy ở NIIT, tôi vẫn thường hỏi các học viên là: Bạn mất bao nhiêu thời gian cho việc học ở đây? Đáng tiếc, câu trả lời thông thường vẫn là 6h/tuần, tương đương khoảng 1h/ngày, hoặc nếu có bài làm thêm ở nhà thì là 12h/tuần. Bạn nghĩ sao nếu một người khác có cùng khởi đầu như bạn, nhưng họ đầu tư 6h/ngày cho việc học? Kết quả là, bạn sẽ mất 6 tháng để làm được thứ mà họ chỉ cần 1 tháng để hoàn thành. Kiến thức của họ sau 2 năm so với bạn là thế nào?

Sự thực, đối với một sinh viên, cá nhân tôi nghĩ rằng 6h cho một ngày vẫn không đủ. Vậy con số đó là bao nhiêu?

Hãy nhìn những người xung quanh bạn, họ sẽ là người cạnh tranh với bạn trong công việc sau này. Họ mất bao nhiêu thời gian cho việc học? Vậy nên con số tương đối mà tôi có thể nói là con số lớn hơn những người xung quanh bạn đã dành ra. Nhưng nếu chỉ biết lao đầu vào học bạn sẽ bỏ lỡ nhiều thứ, cũng như khả năng thu nhận thông tin cũng chỉ có giới hạn, vậy nên, bạn cần xem khoảng thời gian nào tốt nhất trong ngày cho việc học, số giờ chúng ta có thể dành ra được, thời gian nghỉ ngơi thư giãn, sao cho thời gian được sử dụng hiệu quả nhất.

Đọc sách

Đọc sách hiển nhiên là quan trọng. Nhưng cách đọc cũng quan trọng không kém. Sách chuyên ngành thông thường không dễ đọc và hiểu, nhất là đối với người chưa thành thạo với nội dung mà sách nói đến, do vậy bạn nên đọc một cuốn sách nhiều lần để có thể nắm bắt hoàn toàn nội dung.

Cách đọc của tôi là lướt qua toàn bộ sách thật nhanh một lần để biết nó nói gì, thậm chí không đọc các ví dụ, làm các bài tập. Sau khi đọc lướt như vậy bạn sẽ nắm được cơ bản nội dung cuốn sách, chủ đề chính mà nó nói đến. Khi đọc lại lần thứ hai, tôi sẽ đọc thật kỹ, làm theo từng bước hướng dẫn trong đó, tôi phải đảm bảo hiểu và nhớ tất cả những gì đã đọc. Nếu bạn cảm thấy việc hiểu và nhớ những gì mình đọc là không cần thiết, tốt nhất đừng phí thời gian vào việc đọc sách, sẽ chẳng có lợi ích gì cho bạn.

Tôi nhớ khi mới học, có những quyển sách tôi đọc rất nhiều lần, thậm chí mười lần, hai mươi lần. Tôi đảm bảo với bạn tôi có thể nói vanh vách về tất cả những gì có trong đó, nhờ vậy, khi đọc một cuốn sách ở mức độ cao hơn, tôi có thể nắm bắt dễ dàng hơn nhiều so với những người khác.

Tuy nhiên hãy nhớ không phải chỗ nào trong sách cũng cần phải nhớ, có những loại sách tham khảo mà điều duy nhất bạn cần nhớ là chủ đề nào nằm ở đoạn nào trong đó, nó sẽ giúp bạn dễ dàng hơn trong việc tra cứu thông tin sau này.

Thực hành càng nhiều càng tốt

Hãy tận dụng thời gian để làm các bài tập, thật thành thạo. Tốt nhất hãy tìm những cuốn sách có sẵn bài giải, và hãy dùng bài giải mẫu đó để so sánh với bài giải của mình sau khi tự mình hoàn thành chúng.

Việc thực hành là cực kỳ quan trọng trong ngành IT, là một trong những yếu tố then chốt giúp bạn phát triển kỹ năng và kinh nghiệm, vậy nên hãy cố gắng tận dụng thời gian để làm càng nhiều càng tốt. Theo tôi nếu đang còn đi học, 3-4 giờ mỗi ngày là phù hợp cho việc thực hành mỗi ngày của bạn.

Thị trường đang cần gì?

Bạn nên học thứ mà bạn thích. Đúng! Nhưng thị trường cũng vẫn có một vai trò quan trọng, bởi nếu không có đất dụng võ, niềm đam mê của bạn rồi cũng sẽ dần mai một.

Hãy lập một danh sách những thứ bạn thích, từ nhiều đến ít. Sau đó cố gắng đánh giá chúng theo mức độ quan tâm của thị trường, trong hiện tại và tương lai, nếu một mục nào đó là khó có thể phát triển, hãy loại ra khỏi danh sách, bằng cách này bạn sẽ biết được nên chọn gì để học.

Nhưng làm thế nào để biết một công nghệ, một xu hướng nhận được sự quan tâm của thị trường hay không, và trong tương lai nó phát triển thế nào? Hãy tìm đọc các tạp chí chuyên ngành, tham khảo trên các trang web công nghệ, và một kênh quan trọng là tham khảo những người có kinh nghiệm. Bạn là người quyết định cuối cùng, khó, nhưng vẫn phải làm, vì nó chính là tương lai của bạn.

Tiếng Anh, tiếng Anh và tiếng Anh

Không cần phải nói về tầm quan trọng của tiếng Anh. Có một vốn tiếng Anh tốt bạn có thể dễ dàng đọc tài liệu, tìm kiếm thông tin trên Internet, đọc các sách của nước ngoài vốn phong phú, chính xác và cập nhật hơn nhiều so với sách tiếng Việt. Ngoài ra có một vốn tiếng Anh tốt sẽ có thêm cơ hội làm việc tại các công ty nước ngoài, có nhiều ưu đãi, cũng như môi trường làm việc tốt hơn so với các công ty của Việt Nam.

Tôi vốn không được học tiếng Anh trong trường phổ thông (tôi học tiếng Nga), khi vào đại học, nhờ học thêm tôi cũng biết một chút tiếng Anh, nhưng khi tiếp xúc với các sách chuyên ngành, thực sự tôi gặp rất nhiều khó khăn. Vào thời điểm đó cũng không có nhiều tài liệu để bạn tham khảo (Việt Nam mới chỉ kết nối Internet vào cuối 1997, và việc sử dụng vô cùng đắt đỏ), vậy nên để làm quen với việc đọc sách chuyên ngành, tôi phải tìm mua ở các hiệu sách cũ. Và cuốn sách đầu tiên tôi tìm được là cuốn “Mạng Nơron”, nói về một chủ đề xương xẩu ngay cả nếu nó viết bằng tiếng Việt :D, nhưng dù sao đó cũng là lựa chọn duy nhất của tôi. Tôi tin rằng việc đọc sách chuyên ngành bằng tiếng Anh luôn là khó khăn đối với tất cả những ai mới bắt đầu, nhưng những gì khó khăn mới chính là cơ hội.

Tiếng Anh chính là điều kiện đủ để bạn thành công trong ngành IT.

Kỹ năng mềm

Kỹ năng mềm vẫn luôn là điểm yếu của các sinh viên. Những thứ kiểu như nói trước đám đông, thương thuyết hay gì gì đó gọi chung là kỹ năng mềm luôn là một cái gì xa xôi, thế rồi một ngày nó đột ngột xuất hiện trước mặt, và tất nhiên nó sẽ trở thành một thất bại hay một cơ hội sẽ tùy thuộc vào bạn, vào việc bạn đã chuẩn bị cho điều đó như thế nào. Hãy tham khảo những người xung quanh, hãy tận dụng mỗi khi có cơ hội, và hãy luôn tự đánh giá và rút kinh nghiệm bản thân.

Hãy suy nghĩ

Học thì phải suy nghĩ, một điều tưởng như là hiển nhiên ấy vậy mà có những người vẫn quên mất. Bạn học rất chăm, bạn thực hành rất nhiều, nhưng chừng đó là chưa đủ để vượt lên, để tách ra, để khác biệt. Bạn vẫn cần phải suy nghĩ.

Hãy dành một khoảng thời gian trong ngày, đừng làm gì cả, hãy nhớ lại những gì đã làm, suy nghĩ, nghiền ngẫm về nó, cứ để tâm hồn bạn lan man. Tin tôi đi, bạn sẽ nghiệm ra nhiều điều rất thú vị, và tôi cũng tin rằng, bạn sẽ thấy đây chính là lời khuyên giá trị nhất mà tôi dành cho bạn.

Hãy suy nghĩ!

All Systems Are Go: An Interview with Rob Pike, the Co-developer of Google’s Go Programming Language

Danny Kalev talks with Rob Pike, the co-developer of Google’s new Go programming language. In this interview, Pike speaks about the limitations of C++ in large-scale projects, the design philosophy of Go and its unusual type-system, and Go’s future.

Danny Kalev: What’s the design philosophy of Go? Which drawbacks of other programming languages did you try to avoid? Which programming languages inspired you?

Rob Pike: The goal was comprehensibility. The features of Go are intended to be orthogonal so that when they’re combined, they interact in clear, predictable ways. Once you understand the building blocks (methods, interfaces, concurrency, and so on), you shouldn’t need help from the reference manual to write interesting code.

Some languages informed the design; many ideas were borrowed from existing languages. But the inspiration came from our collective experience as programmers, writing real software.

Danny: What difficulties are associated with designing a programming language from scratch, as compared to using an existing programming language as a platform for extensions and modifications?

Rob: It’s a lot of fun, which is why so many languages are out there. The trick is to control the urge to put in every feature that comes to mind. It’s also important to worry more about semantics than syntax.

Robert Griesemer, one of the original Go troika, has observed that the language turned out much better than a language he would have designed himself. I agree with that sentiment—it’s better than a language I would have designed myself. Ken Thompson, Robert, and I all brought different perspectives and backgrounds to the discussions, even as we shared a desire to solve common problems.

Consensus drove the design. Nothing went into the language until all three of us agreed that it was right. This meant that some features didn’t get resolved until after a year or more of discussion. A bad feature is much harder to take out than a good feature is to put in.

Danny: Who are the target users of Go? For example, is Go suitable for real-time/embedded systems and system programming? Or is it likely to attract mostly web application developers?

Rob: Our target community was ourselves, of course, and the broader systems-programming community inside Google. As the language developed, we were pleased and a little surprised to find it suitable for general-purpose programming. Go could be used for real-time and embedded work, although some more development of the libraries would likely be necessary. It’s useful today for many systems jobs. It’s been used for everything from back-end server software and high-volume web servers to interactive games. It’s too early to say what community, if any, will find Go to be the right language for their problems, but there are lots of possibilities.

Danny: What can experienced C++ programmers expect from Go? What are the main advantages that they’ll find in it? What might deter them?

Rob: Go is more unusual than you might first realize. The combination of concurrency, its unusual type system, full closures, and reflection make it surprisingly expressive. C++ programmers who give Go a fair chance may be surprised at its power. Go is a much simpler language, but it captures a lot of the essentials. Programmers may notice that some of their favorite features are missing, but they may also find that lack more than compensated by other properties of the language.

Go is also a lot lighter on the page. Although Go’s syntax isn’t radically different from C’s in most respects, we tried to simplify and regularize it. Initialization expressions imply the type in declarations, which means that type names are rare outside function signatures, for example. And there are far fewer semicolons. Also, as in Java, in Go the package system means that you only need to declare things once, not in the header and in the implementation. These creature comforts add up.

Go has converted a number of C++ programmers. We were surprised that it also appeals to a number of Python programmers, who find it to be nice to use but much more efficient—and statically typed.

Danny: Go supports only interface inheritance, but it doesn’t have proper inheritance. Will inheritance be added in the future, or does this design decision express disappointment with traditional object-oriented programming concepts, particularly inheritance?

Rob: Go does have proper inheritance, although it’s different from inheritance in C++. C++ inheritance, which is based on subtype polymorphism, combines classes, virtual functions, visibility of members, and so on into a powerful but intricate and subtle mix.

Go takes a different approach. Rather than subtype polymorphism, Go has embedded anonymous fields (embedding for short). Embedding is a simple concept orthogonal to the other elements of the type system, such as structures and interfaces. It injects fields and methods of an existing type into another type. (In fact, there is no explicit concept of subtype in Go). Embedding is a building block that can be used to create the effect of inheritance, but also of forwarding, of prototype-based type systems, and more.

Go is object-oriented, even though it doesn’t have the notion of a class. The type system is more general. Any type—even basic types such as integers and strings—can have methods. This allows inheritance and other object-oriented techniques to apply more broadly than with classes alone. For instance, Go’s formatted printing library, package fmt, uses interfaces and methods to provide a way to use a printf-like API to print any value, ranging from basic types to arbitrary user-defined objects, with perfect type safety.

Danny: It’s no secret that C++ is an old programming language. However, its main benefit today is its Standard Library of generic algorithms and containers. Migrating from C++ to any other programming language means giving up this benefit. Will Go offer its own library of generic containers and algorithms in the future?

Rob: C++ is large enough that different users see it differently. I agree that for some the STL is important; for others, it’s operator overloading, or RAII, or simply having an object-oriented language that runs close to the metal. And of course many programmers don’t use C++ at all.

As far as Go and generics are concerned, we’re actively trying to find a design that sits well with the other features of the language. It’s not easy in any language, I suspect. If—and only if—we find the right design, Go will acquire generics, and then likely a generic library of some kind. Meanwhile, we’ve found that, although generics would be nice, they’re not as vital to Go as they might be in other languages. The built-in string, slice, and map types cover many of the needs addressed by the STL in C++. Not all, of course, but a significant amount.

Danny: In a recent interview for DevX, you mentioned the complexity of industrial programming languages such as Java and C++. Can you pinpoint the specific problems you were facing while using C++ in industrial projects? How does Go avert these problems?

Rob: The starting point was long compile times—for some of our big software at Google, build times can be unreasonably long, even with our large distributed compilation clusters. The dependency management (or lack thereof) in C and C++ results in far too much code going through the compiler. You might say that Go was conceived while waiting for a big compilation.

C++ header files, which are just a mechanism for source code inclusion, make dependencies hard to manage; bloat is almost inevitable. Go has a strong package system that compiles all dependencies out to a single level—which not only speeds up compilation, but forces a cleaner dependency hierarchy.

C++ is very powerful, but also very low-level in many respects. Every time I compile a .cc file, #include <string> teaches the compiler about strings. Why can’t the language just have strings?

We also thought that it was important to provide language-level support for concurrency. Multiprocessors are easier to program when the language knows about stack and memory management, and when it provides messaging and synchronization primitives.

Go automates a lot of the fussy details that C and C++ (and to a lesser extent, Java) make explicit. This makes it a different kind of language. Go takes a strong stand about issues such as memory management and concurrency, issues that C++ leaves to the programmer.

Go isn’t intended to replace Java, C++, or any other language. It was designed in response to some of the problems we encountered while writing large systems for modern hardware. The result seems to work well as a general-purpose language, one that many programmers have found delightful to use.

Danny: The evolution of Java, C#, and several other new programming languages suggests that they start out as simple and easy to learn, but this simplicity is illusory. After a maturation process that takes about 10 years, they all become too complex to learn and use, carrying around excess baggage of deprecated APIs and obsolete features. How can you ensure that Go wouldn’t undergo a similar process?

Rob: That’s a very good question, and we’ve thought about it a lot. There’s no real answer except to say that time will tell, and we’ll try very hard to keep the language and the environment clean. Perhaps the best defense is resistance to features that don’t fit cleanly into the language and libraries.

Danny: Java, C#, Objective C, and now Go are all proprietary languages whose design and evolution is steered by a commercial company with interests that don’t necessarily coincide with those of the programmers using these languages. The outcry over Apple’s iPhone 4.0 OS developer license is a good example of such a conflict. What were your motives for choosing the proprietary language model? How much influence will users have on Go’s design?

Rob: Go isn’t proprietary—it’s completely an open source project. All of the development of Go is done in the open, in a public source-code repository and using public mailing lists. Like any other source of good ideas, users have influence (subject to the goals of the language). Go was only launched a few months ago, yet we have over a hundred contributors to the project—and that number continues to grow. For instance, the FreeBSD and Windows ports of Go were done entirely by contributors outside Google.

Danny: Is the name “Go” final? My main concern is that search engines (including Google’s, of course) will have a hard time distinguishing between Go-related web pages and the billions of occurrences of the English verb go.

Rob: Search engines are good at context, and with context the name Go (like the names C, Java, and Ruby, and many other programming language names with alternate meanings) is distinguished just fine. Searches for programming-language topics and "go" find good results. For instance, the queries "go concurrency" and "go interfaces" grab lots of useful results. And even if I search for just "Go", the official Go site comes out near the top.

We like the name. It’s short, evocative, and captures the spirit of the language.

Theo InformIT

Silverlight 4 + RIA Services – Ready for Business: Bản địa hóa ứng dụng cho doanh nghiệp

Để tiếp tục loạt bài, hãy cùng bản địa hóa ứng dụng của chúng ta.  Hiện nay, việc hỗ trợ chỉ một ngôn ngữ trong ứng dụng cho doanh nghiệp không còn đủ nữa.   Nhiều ứng dụng kinh doanh trong thế giới thực cần hỗ trợ cho nhiều ngôn ngữ khác nhau.  Để biểu diễn cho việc này, ta hãy cùng xem qua việc bản địa hóa có trong Silverlight Business Application Template.

Bạn có thể tải về toàn bộ chương trình tại đây.

Continue reading “Silverlight 4 + RIA Services – Ready for Business: Bản địa hóa ứng dụng cho doanh nghiệp”

Silverlight 4 + RIA Services – Ready for Business: Tối ưu hóa tìm kiếm (SEO)

Để tiếp tục loạt bài, ta hãy xem tiếp SEO (tối ưu hóa cho các máy tìm kiếm) và Silverlight. Thông tin trên web hiện nay được dẫn dắt chủ yếu bởi các máy tìm kiếm, các máy tìm kiếm cũng là nơi dừng chân đầu tiên cho nhiều người dùng trên mạng Internet công cộng và cũng đang tăng lên trong môi trường doanh nghiệp. Tìm kiếm cũng là công nghệ chính mang đến doanh thu từ quảng cáo. Vậy nên sẽ là thừa nếu phải nói SEO quan trọng. Nhưng SEO sẽ làm việc thế nào trong các ứng dụng Silverlight khi mà hầu hết dữ liệu sẽ được sinh ra động? Tôi sẽ giới thiệu một mẫu ứng dụng để SEO trong Silverlight với chỉ những thao tác tối thiểu.

Continue reading “Silverlight 4 + RIA Services – Ready for Business: Tối ưu hóa tìm kiếm (SEO)”

So sánh LINQ to SQL và ADO.NET Entity Framework

LINQ to SQL và Entity Framework có rất nhiều điểm chung, nhưng mỗi cái có những đặc tính riêng nhắm đến những trường hợp khác nhau trong Orcas (bản VS 2008).

LINQ to SQL có các đặc tính hướng đến việc phát triển nhanh ứng dụng với CSDL Microsoft SQL Server. LINQ to SQL cho phép bạn có một cái nhìn chặt chẽ về kiểu với cấu trúc của CSDL của bạn. LINQ to SQL hỗ trợ việc ánh xạ 1-1 trực tiếp cấu trúc dữ liệu của bạn vào các lớp; một bảng đơn có thể được ánh xạ vào một cấu trúc phân cấp (ví dụ một bảng có thể chứa person, customer và employee) và các khóa ngoài có thể ánh xạ thành các quan hệ strongly-typed. Bạn có thể thực hiện truy vấn trên các các bảng, các view hay thậm chí các kết quả dạng bảng trả về bởi một function thông qua các phương thức. Một trong những mục tiêu thiết kế chính của LINQ to SQL là nhằm làm cho nó có thể dùng được ngay đối với những trường hợp thông thường; vậy nên, ví dụ bạn truy cập một tập các order thông qua thuộc tính Orders của một customer, và các order của customer đó chưa được đọc vào, LINQ to SQL sẽ tự động đọc vào từ CSDL cho bạn. LINQ to SQL dựa trên những quy ước cho trước, bạn có thể dựa trên các quy ước này để tùy biến, chẳng hạn như thay đổi các thao tác mặc nhiên cho việc insert, update và delete bằng cách tạo ra những câu lệnh thao tác với CSDL (ví dụ “InsertCustomer”, “UpdateCustomer”, “DeleteCustomer”). Các phương thức này có thể gọi các thủ tục trong CSDL hay thực hiện thêm các thao tác để xử lý các thay đổi.

Entity Framework có các đặc tính nhắm đến các ứng dụng doanh nghiệp (“Enterprise Scenarios”). Trong một doanh nghiệp, một CSDL thông thường được kiểm soát bởi DBA (người quản trị CSDL), cấu trúc của CSDL thông thường được tối ưu cho việc lưu trữ (hiệu năng, tính toàn vẹn, phân hoạch) hơn là cho một mô hình ứng dụng tốt, và có thể thay đổi qua thời gian khi dữ liệu và việc sử dụng phát triển lên. Với ý tưởng này, Entity Framework được thiết kế xung quanh việc xây dựng một mô hình dữ liệu hướng tới ứng dụng, ít phụ thuộc, thậm chí có thể khác một chút so với cấu trúc CSDL thực sự. Ví dụ, bạn có thể ánh xạ một lớp đơn (hay “thực thể”) và nhiều table/view, hay ánh xạ nhiều lớp vào cùng một table/view. Bạn có thể ánh xạ vào một cấu trúc phân cấp vào một table/view đơn (như trong LINQ to SQL) hay vào nhiều table/view (ví dụ: person, customer, employee có thể nằm trong các bảng riêng biệt vì customer và employee chỉ chứa thêm một số thông tin không có trong person, hoặc lặp lại các cột từ bảng person). Bạn có thể nhóm các thuộc tính vào các kiểu phức hợp (“complex”, hay “composite”), ví dụ một kiểu Customer có thể có thuộc tính “Address” với kiểu Address có các thuộc tính Street, City, Region, Country và Postal). Entity Framework cũng cho phép bạn biểu diễn quan hệ nhiều-nhiều một cách trực tiếp, mà không cần tới bảng kết nối như một thực thể trong mô hình dữ liệu, và có một đặc tính mới được gọi là “Defining Query”, có thể được dùng cho việc biểu diễn một bảng ảo với dữ liệu lấy từ một câu truy vấn (ngoài trừ việc cập nhật phải thông qua một stored procedure). Khả năng ánh xạ mềm dẻo này, bao gồm tùy chọn dùng các stored procedure để xử lý các thay đổi, có thể được thực hiện chỉ bằng cách khai báo, hoặc chỉnh sửa lại khi yêu cầu thay đổi, mà không cần phải biên dịch lại ứng dụng.

Entity Framework bao gồm LINQ to Entities đưa ra nhiều tính năng giống với LINQ to SQL trên mô hình ứng dụng ở mức khái niệm; bạn có thể xây dựng các câu truy vấn trong LINQ (hay trong “entity SQL”, một phiên bản mở rộng của SQL để hỗ trợ các khái niệm như strong-typing, đa hình, kiểu phức hợp…) trả về kết quả ở dạng các đối tượng CLR, thực thi các thủ tục hay các hàm trả về kiểu bảng thông qua các phương thức, và cho phép gọi một phương thức để lưu lại các thay đổi.

Tuy nhiên, Entity Framwork còn hơn cả LINQ to Entities; nó bao gồm một lớp lưu trữ cho phép bạn dùng cùng mô hình ứng dụng mức khái niệm thông qua giao diện ADO.NET ở mức thấp dùng Entity SQL, và trả lại kết quả một cách hiệu quả nhờ các DataReader, giảm thiểu tải khi dùng trong các ngữ cảnh chỉ có đọc và không có các xử lý thêm.

Vậy nên, trong khi có nhiều phần bị trùng lắp, LINQ to SQL được nhắm đến việc phát triển nhanh ứng dụng cùng SQL Server, còn Entity Framework cung cấp các lớp truy xuất đối tượng và lưu trữ dữ liệu cho Microsoft SQL Server cũng như các CSDL khác thông qua khả năng ánh xạ mềm dẻo và ít phụ thuộc vào cấu trúc của CSDL.Tôi biết điều này dễ gây nhầm lẫn, và chúng tôi đang cố gắng tìm cách mô tả những điểm khác nhau đó nhằm giúp khách hàng có thể lựa chọn một cách đúng đắn. Xin hãy cho tôi biết nếu bài viết này có thể giúp ích cho bạn, hoặc còn điều gì chưa rõ ràng…

Thanks,

Michael Pizzo

Principal Architect

Microsoft Data Programmability

Người dịch: Bài viết này được dịch lại từ https://namdh.wordpress.com/2010/04/22/linq-to-sql-vs-ado-net-entity-framework/, và nội dung gốc của bài này được sao chép từ http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/dc83097e-9c70-4970-93e2-dbc8636eb321/.

Silverlight 4 + RIA Services – Ready for Business: Xuất ra các dịch vụ WCF (SOAP\WSDL)

Tiếp tục loạt bài của chúng ta, tôi muốn  nói một chút về cách RIA Services có thể được triển khai như một dịch vụ Soap/WSDL. Điều này rất hữu ích nếu bạn muốn cho phép dùng cùng các quy tắc xử lý và truy cập dữ liệu với các client khác Silverlight. Ví dụ một ứng dụng Winforms hoặc WPF và thậm chí là một ứng dụng console. SOAP cũng là một mô hình đặc biệt tốt cho việc tương tác với Java/JEE.

Đầu tiên bạn sẽ phải thêm tham chiếu đến  assembly Microsoft.ServiceModel.DomainSerivves.Hosting.EndPoints từ RIA Services toolkit.

image

Continue reading “Silverlight 4 + RIA Services – Ready for Business: Xuất ra các dịch vụ WCF (SOAP\WSDL)”

Silverlight 4 + RIA Services – Ready for Business: Xác thực người dùng và cá nhân hóa

Trong các ứng dụng doanh nghiệp, thông thường dữ liệu rất có giá trị và do vậy việc kiểm soát được người truy cập cũng như quyền của họ là vô cùng quan trọng. May mắn là điều này cũng rất dễ dàng với RIA Services. Ví dụ, cho là chúng ta chỉ muốn những người đã đăng nhập mới có quyền truy cập dữ liệu, điều này có thể thực hiện dễ dàng bằng cách thêm vào một thuộc tính, giống như dòng 2 trong ví dụ dưới:


  1:     [EnableClientAccess]
  2:     [RequiresAuthentication]
  3:     public class DishViewDomainService : LinqToEntitiesDomainService<DishViewEntities>
  4:     {
  5:

Continue reading “Silverlight 4 + RIA Services – Ready for Business: Xác thực người dùng và cá nhân hóa”

Silverlight 4 + RIA Services – Ready for Business: Xác thực dữ liệu

Để tiếp tục loạt bài, hãy xem qua phần kiểm tra dữ liệu trong ứng dụng của chúng ta. Khả năng cập nhật đã rất tuyệt, nhưng một khi đã cho phép cập nhật, bạn cũng cần kiểm tra dữ liệu để đảm bảo nó hợp lệ. RIA Services cung cấp một hình mẫu rõ ràng, kinh điển cho việc này. Trước tiên hãy xem qua những gì ta đã có sẵn: giá trị của bất kỳ ô dữ liệu nào cũng đều phải khớp với kiểu của nó. Ví dụ, bạn sẽ không bao giờ phải viết lệnh để đảm bảo người dụng không gõ “forty-two” vào một ô văn bản gắn với một trường có kiểu int. Bạn cũng có được một số hỗ trợ rất tốt và trông rất đẹp trên phần giao diện.

Continue reading “Silverlight 4 + RIA Services – Ready for Business: Xác thực dữ liệu”

Kỷ niệm thời đi học :)

Tranh thủ mấy ngày lễ về thăm nhà, lục lại đống đồ cũ, thấy vẫn còn mới, nhanh thật mới đó mà đã mười mấy năm…

Mấy cái đĩa mềm, mình 2 lần mất dữ liệu vì hỏng đĩa :(, tiếc nhất là bộ source code chương trình DaLat Anti-Virus, mất 3 tháng viết ròng rã :((.

Hồi đó món khoái nhất vẫn là Assembly, bộ Cẩm nang lập trình hệ thống và Cẩm nang lập trình của Peter Norton mình đọc phải 30 lần :D.

Năm 97-98 đã bắt đầu viết Java và dùng Linux, nhưng hồi đó từ A-Z đều chỉ dùng dòng lệnh, và chỉ cần 1 cái đĩa 1.4M là có thể chơi cả 2 em, bây giờ gì cũng có sẵn, dùng dòng lệnh nhiều cũng dễ gây nghiện!

Còn 1 quyển PC World được tặng vì viết bài, bài này là “Cài mật mã vào chương trình”, dùng để inject một đoạn mã vào trong các file thực thi, giúp bảo vệ các chương trình nếu không muốn người khác dùng, quả này hồi đó cá kiếm được 450k nhuận bút ^^, gửi trước đó gần nửa năm mới được đăng.

C# 4.0: Truyền tham số theo tên

Trong C# 4.0, bạn không cần truyền các tham số theo đúng thứ tự của nó, mà có thể dùng tên để chỉ ra tham số được truyền tương ứng. Trong nhiều trường hợp, điều này giúp chương trình của bạn dễ hiểu hơn.

Ví dụ:

void MyMethod(int a, string s) 
{
    doSomeThing();

}

Bạn có 2 cách để gọi phương thức này:

MyMethod(10, "my string");

hoặc theo tên tham số:

MyMethod(a: 10, s: "my string");

và tất nhiên nếu dùng tên thì các tham số không cần phải đặt theo đúng thứ tự khi khai báo:

MyMethod(s: "my string", a: 10);

Cách truyền theo tên cũng có thể dùng chung với cách truyền theo thứ tự, tuy nhiên trong trường hợp này các tham số truyền theo tên phải nằm sau, ví dụ:

MyMethod(10, s: "my string");

ví dụ sau là không hợp lệ:

MyMethod(a: 10, "my string");