This article discusses the habits which would need to be avoided if a person wants to become a good programmer.

Introduction and background



The information technology is not a new term now. For a common person, this is the field which guarantees good money and life (in the context of INDIA). People working in this industry are looked up-to and generally considered intelligent than others. 
After working for quite some time in this industry, looks like the above points are coming very close to being a myth.
Definitely this industry has been life changer for many and also big employer, foreign currency grabber but by large it would be interesting to know what’s the reality at ground level.
Many would comment that the quote about intelligence is overrated and this is just another industry with revenues in dollars helping for mammoth turnovers.
The common minimum ingredient of this industry is a programmer (or a developer or coder) who is the one writing the programs which are supposed to make things happen. As in every field of life, there are good programmer and bad programmers. The other hot topic in this industry is whether this industry possesses chunk of good programmer or not. Many wouldn’t agree.
So, what makes a good programmer? This is debatable point and to make things simpler, let’s see this the other way round i.e. discuss the top 10 enemies which can prevent oneself from becoming a good programmer.

Objective


To know about the DONT's if anyone wants to become a good programmer.

Description

Programming world is a confusing world. There have been so many languages, technologies, platforms, infrastructures to choose from which doesn't make life of a programmer easy even though they are supposed to. In the scenario where business needs are outscoring the engineering practices, the programming has become a real complex thing increasingly challenged by time and budget. There has been lot of research into software metric to measure the performance and quality but it still not straightforward to categorize programmers and probably say who is good or bad. Following are list of points which if we can ensure while programming, would definitely result in better code quality, better planning and better professional life. These points are picked up from real incidences which always keep happening with considerable frequency and it is observed that such incidences leads to poor quality, performance and higher costs. These points are not just related to technical skill but rather the attitude, awareness, behavior.

1. Is it computer or my program: When something goes wrong there is a tendency to term that it must be something wrong with computers or something else other than me? It’s funny but it omnipresent statement one hears. Barring few cases, it’s always the program doing something wrong rather than computer. If we take environmental, infrastructural attributes into account while programming we won't end of saying this. This is the biggest enemy.
2. Its working on my PC: This is probably mostly used age old statement and many have encountered it umpteen times. It is hard to believe but it happens all the time that the programs work well on developer’s machine but fail after deployment... Do we program for our own pc or our programs are intended to run only on the developer’s machine? Surely not and this is caused by insufficient programming skills and not enough knowledge of working environments, necessary settings etc.
In most of such cases, mostly the programmer has forgotten to update the deployed environment with some settings/ configurations, some component missing etc. rather than anything else.
3. Finger pointing: I have just changed it but I didn’t cause this error, it must be somebody else who might have worked on the same stuff. This is a statement one would hear all the time and it’s generally the first reaction one would hear when asked about some error or fault. In reality, something is changed and the original functionality is also lost then these statements are made. This is quite intriguing that something is changed and before a change things were working and still the programmers say this. This depicts the lack of ownership as well as understanding and escapist attitude. Given the complexity and difficulty to find the facts, many are encourage saying this.
There is a small remedy to overcome this and which is the practice of performing unit testing and take my word, life would be easy.
4. Skipping the validation of user input: While programming for user interactive applications / programs, one tends to skip the validation of user inputs under the assumption that he has coded for it and it shall work. The minimum check which is like confirming the data entered in GUI doesn’t exceed the data type and lengths defined in the database. No wonder, many of the defects and also the program crashes arises out of lack of such validation.
It is better to always ensure that the data types and lengths on GUI matches with the ones defined in data source and also it handles the common pitfalls which can spell doom for hackers. 
5. Not estimating (or planning) the work or tasks: Most of the programmer (especially junior ones) has urged to jump into coding without estimating the work. Estimation is just not important from planning perspective but it gives an opportunity to revisit the scope as the estimates are bound to scope.
There might couple of tasks challenged by time and/or budget which can be performed well without estimates but not     all. Whatever may the work or tasks if it is estimated, then it ease out planning, controlling and monitoring and also         given an avenue for asking the help before it is too late?
6.   Swallowing the exceptions: Exception handling is still a mystery for many programmers and when he/ she don’t know how to handle the exception or there is lack of good exception handling mechanism, the exceptions are swallowed means not action is taken after the occurrence of such exceptions or errors.
     Today's programming languages offers far more sophisticated mechanism in the form of try-catch-finally. This           swallowing mostly results into application crashes putting programmers into awkward position.
7.   Blindly copying and pasting: In today’s internet era, everything is available on internet and code snippets are not exceptions to this. With super-efficient searches, it is possible to locate code snippet which can do one's job.     
Probably it can't be called wrong to copy such code snippets and use but unfortunately the usage is always coincided      by blindly copying or retrofitting which results into partial solutions not taking into account the existing scenario. Also      one has to remember that such code snippets needs more rigorous testing than your native code to make sure that it      is doing what is needed. Another example is copying from code samples or others code which generally skips the            understanding curve resulting into inferior quality software and it is also difficult to change such program and                  maintain too. So copying and pasting is unavoidable but it would be better to invest some time to understand what it      is doing and what is expected to be done and perform this with sound judgment.
8. Not being latest: The technology paradigm is characterized by the continuous changes and improvements. While working hard and long, many programmers are not able to synch them up with such changes and improvements. This may result in inferior solutions or far more time investment than could be justified. Also there are many changes happening on software engineering front where new methodologies like Agile, XP are introduced which can address many pertinent challenges in development life cycle.

9.  Lack of Documentation/ comments/standardization: No denying the fact the programs are written to be executed by computers but they are also written which could be understood by others. Many programmers shy away from writing enough comments or documentation which can help others about why, how and when something is done. Essentially this makes other programmer not attempting to understand and write something which would add to confusion. There are many instances of coding horrors, coding mess, coding chaos which have one thing in common and i.e. lack of documentation and standardization. Essentially the programs shall be human readable.

10. Speed well than accuracy:This is a trap for even the proven programmers. Many programmers think that the programming is 100 ctr races and one has to be lightning fast to win this race and in the process the quality, accuracy is sacrificed. This catapults into more work (many would want this for continuity of their business) which is not good of one looks at cost and time. Accuracy could attain more priority and speed with accuracy could be the motto. 

Summary and Conclusion

This topic is exhaustive and complex to discussed and addressed on one write-up. Still these 10 point are put forth to touch base the perennial challenges in software industry. There may be more apt points and detailed discussions but hope that this write-up could help to bring some really interesting practices to the fore.

10 enemies of being a good programmer

Đây là 1 comment của bạn Hoàng Minh Triết. Bạn ấy đề nghị tôi đưa lên thành 1 bài viết. Nhận thấy đây cũng là 1 chia sẻ rất hay nên tôi tôi quyết định đưa lên để mọi người cùng chia sẻ ý kiến của mình.

Cám ơn bạn Triết rất nhiều!

Lựa chọn ngành CNTT: Tôi đã đi lầm đường hay có quá nhiều quyết định sai trái?

1/ Bước vào cổng đại học

Cách đây 5 năm, sau khi tốt nghiệp PT tại 1 trường thuộc hàng top tại tp.hcm, tôi quyết định chọn thi vào ngành CNTT, và xác định trước hướng theo học là công nghệ phần mềm.

Theo lời khuyên của ba tôi, tôi cũng vào học tại 1 trung tâm đào tạo lập trình viên Aptech, để vừa có bằng đại học mà tiến thân, vừa có kỹ năng làm việc thực hành. Điều kiện của tôi thuận lợi hơn tất cả mọi người cùng trang lứa, và sức học của tôi cũng khá, dễ dàng vượt qua các bài thi. Thậm chí, đến giai đoạn chuyên ngành điểm các môn chuyên ngành có thấp lắm cũng chỉ dừng ở 7, và phổ biến ở mức 9,10.

2/ Có nên đi làm trong lúc còn đi học?

Lúc đó là vào khoảng đầu năm 3 đại học, tháng 11 năm đó, tôi cũng vừa tốt nghiệp xong chương trình LTV Aptech, và cũng hào hứng háo hức đi làm. Chỉ sau 3 ngày post hồ sơ lên các trang mạng tuyển dụng, có hơn 4 ,5 công ty gì đó mời cộng tác.

Tôi hớn hở về nhà khoe với ba mẹ, thì được ba mẹ phán cho mấy câu xanh rờn “Nhà mình đâu có thiếu thốn gì mà phải đi làm. Ba còn đi làm, kiếm ra tiền, con muốn học gì thì học, ba mẹ không có tiếc tiền với chuyện học của các con. Chuyện gì chứ chuyện học thì không bao giờ từ chối chi tiền. Giờ cứ lo học cho xong cái bằng đại học đã, rồi muốn đi làm gì thì làm.”. Khi đó tôi có vẻ xìu xuống, nhiệt huyết đi làm giảm dần nhưng vẫn chưa từ bỏ ý định.

Vài hôm sau lên văn phòng khoa xin cái bảng điểm thì gặp cô phó khoa cũng phán cho 1 câu xanh rờn từa tựa như vậy: “Mấy em cứ học xong hết đi rồi hãy đi làm, đừng có gấp, đừng có ham đi làm.”. Thời gian đó cũng sắp thi học kỳ, cộng với bao nhiêu lời khuyên của những ng xung quanh, ý định ban đầu không còn chắc chắn nữa, lung lay dần đi.

Tôi quyết định nghe theo mọi người, cũng vì câu mà mẹ tôi hay nói: “biết nghe lời đi, đứa nào cãi tao thì chỉ có chết tới bị thương”, và mỗi khi tôi thất bại thì mẹ hay lôi câu đó ra mà phán. Nghe cũng có vẻ hợp với cái lẽ: “cá không ăn muối cá ươn…”. Thế là tôi từ bỏ hẳn ý định đi làm từ sớm, mặc dù rất muốn.

3/ Ra trường

2 năm sau đó, sau khi hoàn tất chương trình đại học, và vượt qua 1 cái luận văn mà nội dung cũng thuộc hàng xương xẩu để lấy 1 điểm số tốt, tôi chính thức tốt nghiệp đh sau đúng 5 năm học. Bảng điểm sạch sẽ, không nợ môn nào trước khi làm luận văn.

Có 1 dịp tình cờ gặp lại thằng bạn thân hồi cấp 3, cũng đã tốt nghiệp ĐH Khoa học tự nhiên. 2 đứa đi cafe karaoke cả buổi với mấy đứa ban nữa để tâm sự. Nó nói: tao thất nghiệp nửa năm nay. Lúc đó tôi cười thầm, không nói gì, cũng không nghĩ gì, vì tôi lạc quan , và có niềmtin vào khả năng của bản thân để bắt đầu 1 hành trình mới:

4/ Đi tìm việc làm.

Nhìn lại bộ hồ sơ tìm việc làm:
+ bằng cấp: đủ
+ bảng điểm: tốt
+ chứng chỉ quốc tế: luôn là 1 lợi thế
+ ngoại ngữ: cũng khá, có điều chỉ đọc được tài liệu chuyên môn chứ giao tiếp thì _@#(%&$*^.
Tôi bắt đầu apply vào những công ty thuộc hàng “ăn trên ngồi trước” trước. Khổ cái:
+ cty nước ngoài thì đòi tiếng Anh giao tiếp
+ các công ty lớn thì đòi kinh nghiệm 2,3 năm.

Tôi bắt đầu “hạ chuẩn” xuống: lương thấp hơn 1 tí, công ty bình dân hơn 1 tí, thì gặp phải đòi hỏi: 1 năm kinh nghiệm: he, cái này không thành vấn đề, nhưng nhìn lại vị trí, công việc, và công nghệ sử dụng, thì nó lại có vấn đề.

5/ Khó khăn nối tiếp khó khăn

Ở ĐH cũng như Aptech, tôi chỉ học về các công nghệ cao cấp như J2EE, .NET là chủ yếu, còn những món như PHP thì không quan tâm lắm. Qua 1 thời gian theo dõi, tôi thấy các cty bây giờ hay chuộng tuyển lt viên làm web, với PHP,MYSQL và 1 số CMS như Joomla, hay Framework Drupal, Template Smarty gì gì đó. Tôi chỉ có biết 1 ít về PHP, vì nó giống C,C++, MYSQL thì cũng có khác gì nhiều so với SQLSERVER đâu, nói chung những thứ lặt vặt về web tôi đều làm được cả, chỉ là chưa biết và chưa có kinh nghiệm với cácCMS,Framework trong lĩnh vực này.

Tuy nhiên 1 cái khó nữa là đã lập trình web, phải biết về nào là Flash, Photoshop,… cái này thì tôi mù tịt hoàn toàn. Tôi chỉ biết chờ đợi xem có công việc nào phù hợp hơn với mình hay không. Nhưng càng ngày cơ hội việc làm càng ít đi. Dạo qua các trang tuyển dụng thì thấy xu hướng tuyển dung như sau:

6/ Xu hướng tuyển dụng tại VN vao thời điểm tháng 6,7 / 2009:

+ Hà Nội: tuyển ltv nhiều, ít kn hoặc mới ra trường chưa đi làm cũng được – nhưng tôi ở HCM mà v
+ HCM: tuyển ltv ít, nhưng phải có kn làm việc 2,3 năm, chỗ nào bèo lắm thì cũng 1 năm + với 1 số thứ tôi không biết như nêu trên.
Ngoài ra, các cty pm tại HCM hiện thời điểm này lại có xu hướng
+ hạn chế tuyển ltv
+ mà tuyển hàng loạt tester
+ và nhân viên kinh doanh phần mềm.

Oax, trong đh chả có môn nào đào tạo về quy trình test, hay kỹ thuật test cả, có chăng môn CNPM thì nói 1 chút, mà cũng chỉ cưỡi ngựa xem hoa qua lý thuyết, hoàn toàn không chú trọng hay nhấn mạnh gì. Còn về vị trí NV kinh doanh pm thì tôi chả quan tâm, vì tôi học rất khá , và mong muốn làm đúng vị trí chuyên môn phù hợp với mình thôi.

Đảo qua đảo lại, tôi thấy nhu cầu tuyển dụng của các cty và khả năng của tôi càng ngày càng ít “khớp nhau”, “hạ chuẩn” chút nữa, tôi chuyển sang tìm các công ty tư nhân cần nhân viên IT. Đối với các cty tư nhân tuyển NV IT như thế này, thì họ chả yêu cầu ngoại ngữ cao, cũng chả yêu cầu lập trình quá giỏi, mà cái họ cần là: 1 NV IT đa năng:

+ lập trình web
+ kiêm webmaster
+ kiêm cài phần mềm
+ bảo trì máy tính
+ đi dây mạng
+ quản trị mạng
+ quản lý csdl, ….
…cái gì cũng làm, nhưng mà lương thấp chủn.

7/ Một thoáng lo âu

Ngày qua ngày cứ lặp lại, nhiều hôm buồn thức đến 3,4 h sáng để vào mấy trang tìm việc, dù biết giờ này còn ai tuyển nữa chứ, mà những tin đó thì trong ngày đã đọc rồi. Thậm chí có những hôm chiều thứ sáu, tôi tranh thủ đọc cho hết mấy cái tin tuyển dụng rao đầy trên mạng nhưng… chả ăn nhậu gì với thứ mình cần tìm, chỉ sợ mai thứ 7 cuối tuần thì không còn gì để đọc.

Ngó lại những thứ họ cần:
+ Nếu là tuyển sv mới tốt nghiệp, thì thường là cty nước ngoài, tuyển về đào tạo lại, và cần khả năng tiếng anh rất lưu loát
+ Nếu là lập trình quản lý với java, .net , thì cần nhiều năm kinh nghiệm
+ Nếu là lập trình web với php, thì cũng phải cần flash, photoshop, design…
+ Nếu có là NV IT quèn, cũng phải cần quản trị mạng, đi dây mạng, làm những thứ linh tinh như sửa máy, cài pm
+ 1 số cty nữa tuyển nv mới tn lương cũng rất khá, nhưng lại làm việc lập trình driver, hệ thống với C,C++ cái này lĩnh vực này bó tay
+ 1 số chỗ tuyển lập trình game, lập trình mobile: không biết tí gì, muốn làm cũng phải bỏ ra vài tháng học và nghiên cứu về mobile environment, graphics 2d,3d – món này không đơn giản , mà đến lúc đó nó hết chỗ rồi (#@&$(#, mà lĩnh vực này rất ít chỗ tuyển thì phải.

8/ Tôi bị mắc sai lầm ở cái công đoạn nào nhỉ?

-> đáng lẽ ra nên chú trọng học ngoại ngữ giao tiếp, hơn là ôm cái mớ kiến thức chuyên môn cày project hết ngày này qua ngày khác?
-> đáng lẽ nên học những thứ bình dân nhưng dễ tìm việc như PHP,MYSQL,Joomla,Flash,Photoshop, hơn là những cái của cao cấp như .NET, J2EE (muốn làm thì phải có kn nhiều năm, mà mới ra trường thì….)
-> không giữ vững lập trường : đáng lẽ nên đi làm từ năm thứ 3 khi có chỗ gọi, để đến bây giờ thì cũng đã có 2 , 3 năm gọi là kinh nghiệm rồi.

Bây giờ công việc hàng ngày của tôi là: học tiếng Anh, học photoshop, học flash, và chờ có chỗ nào nó mướn làm web mà không đòi hỏi đồ họa thẩm mỹ cao thì nhào vô xơi. _o. Thế đấy, học hành cho cố vào, rồi bây giờ thất nghiệp.

Cho đến tận hôm nay, vào mấy trang tuyển việc làm cũng còn quá hẻo, toàn tuyển NV IT , quản trị mạng, và thiết kế đồ họa, flash, actionscript gì đó. Lúc mới vào đh thì CNTT là 1 ngành hot, và cái công việc lập trình viên có vẻ hấp dẫn hơn những thứ này nhiều.

Giờ ra trường rồi, thì thời thế đổi thay. Người ta còn có chỗ dựa hơi, quen biết “này nọ” mà kiếm cái chỗ nương náu, còn đây thì (#&(@#% tự bươn chải. Mặc dù rất chán nản, nhiều hôm gục lên gục xuống nhưng vẫn kiên trì, với chút hy vọng nhỏ nhoi, biết đâu “qua cơn bĩ cực tới hồi thái lai”.

Vô tình đọc được
Còn đầy là ý kiến của thầy Huy, dạy PHP ở Việt Chuyên :
Riêng về quan điểm của tôi trong nghề nghiệp, theo tôi để nhanh tiến tới thành công thì các bạn nên học tích cực khi còn đang ngồi trên ghế nhà trường. Nếu các bạn chịu khó đầu tư tiếng anh và kỹ năng lập trình từ năm nhất thì khoảng cuối năm 2 có lẽ bạn đã khá cứng cáp với nền tảng xây dựng từ đầu. Khi đó bạn có thể đi nhận các dự án theo dạng part time để lấy kinh nghiệm. Đến năm thứ 4 khi bạn ra trường bạn đã có trong tay 4 năm nghiên cứu ngôn ngữ lập trình PHP và 2 năm kinh nghiệm thực tế. Cố gắng tốt nghiệp ĐH với tấm bằng trung bình – khá hoặc khá (đừng để trung bình). Vì như thế CV của bạn sẽ mất điểm trước nhà tuyển dụng.
Mới tốt nghiệp, nhiều bạn ào ào đi làm. Nhưng tôi nghĩ các bạn lúc này hãy dành thời gian khoảng 6 tháng để review và tập trung nghiên cứu kiến thức 1 cách bài bản. Khi đã vững, bạn đừng ngấn ngại nộp vào các công ty lớn để thử sức mình với áp lực công việc.
Dựa vào 4,5 năm làm việc với PHP, tôi tin rằng chẳng mấy chốc các bạn sẽ thăng tiến khá nhanh với nghề nghiệp của mình. Và luôn nhớ rằng đừng bao giờ chấp nhận với lượng kiến thức mình đang có, hãy không ngừng cập nhật, nghiên cứu để làm giàu vốn liếng của bạn. Khi đó cơ hội tự khắc sẽ đến và bạn 1 bước sẽ leo lên vị trí cao trong ngành nghề.
Các bạn cũng nên cẩn thận 1 điều. Làm công ty lớn thì cơ hội thăng tiến đúng là rất cao. Nhưng đổi lại tình người mỏng hơn giấy. Ít bạn bè, nhiều kẻ thù là 1 sự thật trong môi trường CNTT cạnh tranh hiện nay.
Chúc các bạn thành công và đạt được như mong đợi nhé !!!



ref : http://vovanhai.wordpress.com/2011/08/10/l%E1%BB%B1a-ch%E1%BB%8Dn-nganh-cntt-toi-da-di-l%E1%BA%A7m-d%C6%B0%E1%BB%9Dng-hay-co-qua-nhi%E1%BB%81u-quy%E1%BA%BFt-d%E1%BB%8Bnh-sai-trai/

Lựa chọn ngành CNTT: Tôi đã đi lầm đường hay có quá nhiều quyết định sai trái?

In this tutorial I'm going to show you how to build a threaded tcp server with C#. If you've ever worked with Window's sockets, you know how difficult this can sometimes be. However, thanks to the .NET framework, making one is a lot easier than it used to be.

What we'll be building today is a very simple server that accepts client connections and can send and receive data. The server spawns a thread for each client and can, in theory, accept as many connections as you want (although in practice this is limited because you can only spawn so many threads before Windows will get upset).

Let's just jump into some code. Below is the basic setup for our TCP server class.

using System;
using System.Text;
using System.Net.Sockets;
using System.Threading;
using System.Net;

namespace TCPServerTutorial
{
  class Server
  {
    private TcpListener tcpListener;
    private Thread listenThread;

    public Server()
    {
      this.tcpListener = new TcpListener(IPAddress.Any, 3000);
      this.listenThread = new Thread(new ThreadStart(ListenForClients));
      this.listenThread.Start();
    }
  }
}

So here's a basic server class - without the guts. We've got a TcpListener which does a good job of wrapping up the underlying socket communication, and a Thread which will be listening for client connections. You might have noticed the function ListenForClients that is used for our ThreadStart delegate. Let's see what that looks like.

private void ListenForClients()
{
  this.tcpListener.Start();

  while (true)
  {
    //blocks until a client has connected to the server
    TcpClient client = this.tcpListener.AcceptTcpClient();

    //create a thread to handle communication
    //with connected client
    Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
    clientThread.Start(client);
  }
}

This function is pretty simple. First it starts our TcpListener and then sits in a loop accepting connections. The call to AcceptTcpClient will block until a client has connected, at which point we fire off a thread to handle communication with our new client. I used a ParameterizedThreadStart delegate so I could pass the TcpClient object returned by the AcceptTcpClient call to our new thread.

The function I used for the ParameterizedThreadStart is called HandleClientComm. This function is responsible for reading data from the client. Let's have a look at it.

private void HandleClientComm(object client)
{
  TcpClient tcpClient = (TcpClient)client;
  NetworkStream clientStream = tcpClient.GetStream();

  byte[] message = new byte[4096];
  int bytesRead;

  while (true)
  {
    bytesRead = 0;

    try
    {
      //blocks until a client sends a message
      bytesRead = clientStream.Read(message, 0, 4096);
    }
    catch
    {
      //a socket error has occured
      break;
    }

    if (bytesRead == 0)
    {
      //the client has disconnected from the server
      break;
    }

    //message has successfully been received
    ASCIIEncoding encoder = new ASCIIEncoding();
    System.Diagnostics.Debug.WriteLine(encoder.GetString(message, 0, bytesRead));
  }

  tcpClient.Close();
}

The first thing we need to do is cast client as a TcpClient object since the ParameterizedThreadStart delegate can only accept object types. Next, we get the NetworkStream from the TcpClient, which we'll be using to do our reading. After that we simply sit in a while true loop reading information from the client. The Read call will block indefinitely until a message from the client has been received. If you read zero bytes from the client, you know the client has disconnected. Otherwise, a message has been successfully received from the server. In my example code, I simply convert the byte array to a string and push it to the debug console. You will, of course, do something more interesting with the data - I hope. If the socket has an error or the client disconnects, you should call Close on the TcpClient object to free up any resources it was using.

Believe it or not, that's pretty much all you need to do to create a threaded server that accepts connections and reads data from clients. However, a server isn't very useful if it can't send data back, so let's look at how to send data to one of our connected clients.

NetworkStream clientStream = tcpClient.GetStream();
ASCIIEncoding encoder = new ASCIIEncoding();
byte[] buffer = encoder.GetBytes("Hello Client!");

clientStream.Write(buffer, 0 , buffer.Length);
clientStream.Flush();

Do you remember the TcpClient object that was returned from the call AcceptTcpClient? Well, that's the object we'll be using to send data back to that client. That being said, you'll probably want to keep those objects around somewhere in your server. I usually keep a collection of TcpClient objects that I can use later. Sending data to connected clients is very simple. All you have to do is call Write on the the client's NetworkStream object and pass it the byte array you'd like to send.

Your TCP server is now finished. The hard part is defining a good protocol to use for sending information between the client and server. Application level protocols are generally unique for application, so I'm not going to go into any details - you'll just have to invent you're own.

But what use is a server without a client to connect to it? This tutorial is mainly about the server, but here's a quick piece of code that shows you how to set up a basic TCP connection and send it a piece of data.

TcpClient client = new TcpClient();

IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3000);

client.Connect(serverEndPoint);

NetworkStream clientStream = client.GetStream();

ASCIIEncoding encoder = new ASCIIEncoding();
byte[] buffer = encoder.GetBytes("Hello Server!");

clientStream.Write(buffer, 0 , buffer.Length);
clientStream.Flush();

The first thing we need to do is get the client connected to the server. We use the TcpClient.Connect method to do this. It needs the IPEndPoint of our server to make the connection - in this case I connect it to localhost on port 3000. I then simply send the server the string "Hello Server!".

One very important thing to remember is that one write from the client or server does not always equal one read on the receiving end. For instance, your client could send 10 bytes to the server, but the server may not get all 10 bytes the first time it reads. Using TCP, you're pretty much guaranteed to eventually get all 10 bytes, but it might take more than one read. You should keep that in mind when designing your protocol.
That's it! Now get out there and clog the tubes with your fancy new C# TCP servers. As always, comments and questions are welcome.

ref : http://www.switchonthecode.com/tutorials/csharp-tutorial-simple-threaded-tcp-server

C# Tutorial - Simple Threaded TCP Server

While storing information in memory is great, there comes a time your users will have to shut your application down. This means (probably) that you will need to write information to a file at some point, because you will want to store whatever data was in memory. Today, we are going to take a look at a feature built into .NET called Serialization that makes writing and reading data structures to and from a file extremely easy.

For this example, let's say I want to create a program that keeps track of all the cars my friends own. I'm going to create two objects to achieve this: Car and Owner. The Car object will store the make, model, and year of the car. The Owner object will save some information about who owns the car. Each Car object will hold a reference to an Owner object.

//information about the car
public class Car
{
   private string make;
   private string model;
   private int year;
   private Owner owner;

   public Car()
   {
   }
}

//information about the car's owner
public class Owner
{
   private string firstName;
   private string lastName;

   public Owner()
   {
   }
}

Since most of us have more than one friend, we're going to need to create a List of Car objects.

List<Car> cars = new List<Car>();

Now that we have our objects created, we're almost ready to serialize them. When I save data to files, I like to create an object specifically to hold all the things I want to serialize.

public class ObjectToSerialize
{
   private List<Car> cars;

   public List<Car> Cars
   {
      get { return this.cars; }
      set { this.cars = value; }
   }

   public ObjectToSerialize()
   {
   }
}

This class holds a reference to every object we'll want to serialize. In this case, the only thing we want to save is the list of cars. Now lets create the functions that will perform the serialization and deserialization of our object. I usually create a Serializer class to control the writing and reading to and from files.

using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

public class Serializer
{
   public Serializer()
   {
   }

   public void SerializeObject(string filename, ObjectToSerialize objectToSerialize)
   {
      Stream stream = File.Open(filename, FileMode.Create);
      BinaryFormatter bFormatter = new BinaryFormatter();
      bFormatter.Serialize(stream, objectToSerialize);
      stream.Close();
   }

   public ObjectToSerialize DeSerializeObject(string filename)
   {
      ObjectToSerialize objectToSerialize;
      Stream stream = File.Open(filename, FileMode.Open);
      BinaryFormatter bFormatter = new BinaryFormatter();
      objectToSerialize = (ObjectToSerialize)bFormatter.Deserialize(stream);
      stream.Close();
      return objectToSerialize;
   }
}

As you can see, the actual code required to serialize an object is relatively small and simple. At this point, however, the code will not build. Before the Serialize function can be called on ObjectToSerialize we must include the Serializable attribute and it must implement the ISerializable interface.

using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

[Serializable()]
public class ObjectToSerialize : ISerializable
{
   private List<Car> cars;

   public List<Car> Cars
   {
      get { return this.cars; }
      set { this.cars = value; }
   }

   public ObjectToSerialize()
   {
   }

   public ObjectToSerialize(SerializationInfo info, StreamingContext ctxt)
   {
      this.cars = (List<Car>)info.GetValue("Cars", typeof(List<Car>));
   }

   public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
   {
      info.AddValue("Cars", this.cars);
   }
}

As part of the ISerializable interface, the class must include another constructor for deserializing the object and a function GetObjectData which describes how to serialize the object. Since the Car and Owner objects are also being serialized, they will also need to implement these functions.

[Serializable()]
public class Car : ISerializable
{
   private string make;
   private string model;
   private int year;
   private Owner owner;

   public Car()
   {
   }

   public Car(SerializationInfo info, StreamingContext ctxt)
   {
      this.make = (string)info.GetValue("Make", typeof(string));
      this.model = (string)info.GetValue("Model",typeof(string));
      this.year = (string)info.GetValue("Year", typeof(int));
      this.owner = (Owner)info.GetValue("Owner", typeof(Owner));
   }

   public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
   {
      info.AddValue("Make", this.make);
      info.AddValue("Model", this.model);
      info.AddValue("Make", this.year);
      info.AddValue("Owner", this.owner);
   }
}


[Serializable()]
public class Owner : ISerializable
{
   private string firstName;
   private string lastName;

   public Owner()
   {
   }

   public Owner(SerializationInfo info, StreamingContext ctxt)
   {
      this.firstName = (string)info.GetValue("FirstName", typeof(string));
      this.lastName = (string)info.GetValue("LastName", typeof(string));
   }

   public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
   {
      info.AddValue("FirstName", this.firstName);
      info.AddValue("LastName", this.lastName);
   }
}

Now, to save the list of objects to a file, all that needs to be done is to call the Serialize and DeSerialize functions of the Serializer class.

List<Car> cars = new List<Car>();

//save the car list to a file
ObjectToSerialize objectToSerialize = new ObjectToSerialize();
objectToSerialize.Cars = cars;

Serializer serializer = new Serializer()
serializer.SerializeObject("outputFile.txt", objectToSerialize);

//the car list has been saved to outputFile.txt
//read the file back from outputFile.txt

objectToSerialize = serializer.DeSerializeObject("outputFile.txt");
cars = objectToSerialize.Cars;

That is all that's required to save and load custom C# objects to a binary file. Just like any file, it is possible for your files to become corrupted. Because of this, it is probably a good idea to add some error handling whenever output from the file is being cast to an object.

ref :  http://www.switchonthecode.com/tutorials/csharp-tutorial-serialize-objects-to-a-file

C# Tutorial - Serialize Objects to a File

A long while ago we posted a tutorial on how to serialize objects to a binary file. While this is very useful, unfortunately the resulting file is not very human readable. In this tutorial, I'm going to demonstrate how to serialize your own objects to and from an XML file.

Since .NET can use reflection to get property names, basic serialization is unbelievably simple. It only gets slightly difficult when you want to name your XML tags differently than your property names (but still not very hard). If you've ever used an XML serialization package in C++ like boost, tinyXML, or libXML2, you'll see how comparatively easy C# is to use.

Let's start with a basic example. Below is an object that stores some information about a movie.

public class Movie
{
  public string Title
  { get; set; }

  public int Rating
  { get; set; }

  public DateTime ReleaseDate
  { get; set; }
}

All right, now that we have an object, let's write a function that will save it to XML.

static public void SerializeToXML(Movie movie)
{
  XmlSerializer serializer = new XmlSerializer(typeof(Movie));
  TextWriter textWriter = new StreamWriter(@"C:\movie.xml");
  serializer.Serialize(textWriter, movie);
  textWriter.Close();
}

The first thing I do is create an XMLSerializer (located in the System.Xml.Serialization namespace) that will serialize objects of type Movie. The XMLSerializer will serialize objects to a stream, so we'll have to create one of those next. In this case, I want to serialize it to a file, so I create a TextWriter. I then simply call Serialize on the XMLSerializer passing in the stream (textWriter) and the object (movie). Lastly I close the TextWriter because you should always close opened files. That's it! Let's create a movie object and see how this is used.

static void Main(string[] args)
{
  Movie movie = new Movie();
  movie.Title = "Starship Troopers";
  movie.ReleaseDate = DateTime.Parse("11/7/1997");
  movie.Rating = 6.9f;

  SerializeToXML(movie);
}

static public void SerializeToXML(Movie movie)
{
  XmlSerializer serializer = new XmlSerializer(typeof(Movie));
  TextWriter textWriter = new StreamWriter(@"C:\movie.xml");
  serializer.Serialize(textWriter, movie);
  textWriter.Close();
}

After this code executes, we'll have an XML file with the contents of our movie object.

version="1.0" encoding="utf-8"?>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  ></span></span></span>Starship Troopers<span style="color: #000000;"><span style="color: #0600FF;">>

  >
6.9
>
  >1997-11-07T00:00:00>
>
If you noticed, all of the XML tag names are the same as the property names. If we want to change those, we can simply add an attribute above each property that sets the tag name.

public class Movie
{
  [XmlElement("MovieName")]
  public string Title
  { get; set; }

  [XmlElement("MovieRating")]
  public float Rating
  { get; set; }

  [XmlElement("MovieReleaseDate")]
  public DateTime ReleaseDate
  { get; set; }
}

Now when the same code is executed again, we get our custom tag names.

version="1.0" encoding="utf-8"?>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  >
Starship Troopers
>
  >6.9>
  >1997-11-07T00:00:00>
>
Sometimes, in XML, you want information stored as an attribute of another tag instead of a tag by itself. This can be easily accomplished with another property attribute.

public class Movie
{
  [XmlAttribute("MovieName")]
  public string Title
  { get; set; }

  [XmlElement("MovieRating")]
  public float Rating
  { get; set; }

  [XmlElement("MovieReleaseDate")]
  public DateTime ReleaseDate
  { get; set; }
}

With this code, MovieName will now be an attribute on the Movie tag.

version="1.0" encoding="utf-8"?>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   MovieName="Starship Troopers">
  >
6.9
>
  >1997-11-07T00:00:00>
>
Let's move on to something a little more interesting. Let's create another movie and serialize a List of them to our XML file. Here's the modified code to do just that:

static void Main(string[] args)
{
  Movie movie = new Movie();
  movie.Title = "Starship Troopers";
  movie.ReleaseDate = DateTime.Parse("11/7/1997");
  movie.Rating = 6.9f;

  Movie movie2 = new Movie();
  movie2.Title = "Ace Ventura: When Nature Calls";
  movie2.ReleaseDate = DateTime.Parse("11/10/1995");
  movie2.Rating = 5.4f;

  List<Movie> movies = new List<Movie>() { movie, movie2 };

  SerializeToXML(movies);
}

static public void SerializeToXML(List<Movie> movies)
{
  XmlSerializer serializer = new XmlSerializer(typeof(List<Movie>));
  TextWriter textWriter = new StreamWriter(@"C:\movie.xml");
  serializer.Serialize(textWriter, movies);
  textWriter.Close();
}

Now we have XML that looks like this:

version="1.0" encoding="utf-8"?>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  MovieName="Starship Troopers">
    >
6.9
>
    >1997-11-07T00:00:00>
  >
  MovieName="Ace Ventura: When Nature Calls">
    >
5.4>
    >1995-11-10T00:00:00>
  >
>
Ok, so you can see how easy it is to get your objects into an XML document. Let's now look at how to read an XML document back into our objects - deserialization. The process of deserializing is very similar to what we did for serialization.

static List<Movie> DeserializeFromXML()
{
   XmlSerializer deserializer = new XmlSerializer(typeof(List<Movie>));
   TextReader textReader = new StreamReader(@"C:\movie.xml");
   List<Movie> movies;
   movies = (List<Movie>)deserializer.Deserialize(textReader);
   textReader.Close();

   return movies;
}

Just like before, we first create an XmlSerializer that can deserialize objects of type List. The XmlSerializer also deserializes from a stream, so we create a file stream from our XML file. We then simply call Deserialize on the stream and cast the output to our desired type. Now the movies List is populated with objects that we previously serialized to the XML file.

The deserializer is very good at handling missing pieces of information in your XML file. Let's say the second movie didn't have the MovieName attribute on the Movie tag. When the XML file is deserialized, it simply populates that field with null. If MovieRating wasn't there, you'd receive 0. Since a DateTime object can't be null, if MovieReleaseDate was missing, you'd receive DateTime.MinValue (1/1/0001 12:00:00AM).

If the XML document contains invalid syntax, like say the first opening Movie tag was missing, the Deserialize call will fail with an InvalidOperationException. It will also be kind enough to specify the location in the file where it encountered the error (line number, column number).

One thing to remember is that the basic XML serialization won't maintain references. Let's say I populated my movies list with the same movie reference multiple times:

Movie movie = new Movie();
movie.Title = "Starship Troopers";
movie.ReleaseDate = DateTime.Parse("11/7/1997");
movie.Rating = 6.9f;

List<Movie> movies = new List<Movie>() { movie, movie };

Now I have a list containing two of the exact same movie reference. When I serialize and deserialize this list, it will be converted to two separate instances of the movie object - they would just have the same information. Along this same line, the XMLSerializer also doesn't support circular references. If you need this kind of flexibility, you should consider binary serialization.

There's still a lot to cover when it comes to XML serialization, but I think this tutorial covers enough of the basics to get things rolling. If you've got questions or anything else to say, leave us a comment.

ref : http://www.switchonthecode.com/tutorials/csharp-tutorial-xml-serialization

C# Tutorial - XML Serialization