首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我写的代码与领导写的代码,有何区别?

在程序员圈子有很多有趣的等级划分规则,例如格子衬衫是程序员不能放弃的自尊心,衬衫上的格子数目越多,等级越高,技术越厉害;秃顶是尊贵身份的象征,发际线越高,等级越高,经验越丰富;而代码则是一个轮回,随着等级的变化,你会发现你写的代码又回到了“最初的美好”!

编者小贴士:本文仅供娱乐,博君一笑!

首先,我们先来看看不同级别的程序员写的代码都是怎样的?在这里我们把程序员从学生到CEO共分成了14个等级,快来看看,你和你领导写的代码,差在哪里?

初高中同学写的代码

代码语言:javascript
复制
  10 PRINT "HELLO WORLD"

  20 END

## 大学一年级同学写的代码

代码语言:javascript
复制
  program Hello(input, output)

    begin

      writeln('Hello World')

    end.

大学四年级同学写的代码

代码语言:javascript
复制
  (defun hello

    (print

      (cons 'Hello (list 'World))))

初入职场菜鸟程序员写的代码

代码语言:javascript
复制
  #include <stdio.h>

  void main(void)

  {

    char *message[] = {"Hello ", "World"};

    int i;

 

    for(i = 0; i < 2; ++i)

      printf("%s", message[i]);

    printf("\n");

  }

工作多年的资深程序员写的代码

代码语言:javascript
复制
  #include <iostream.h>

  #include <string.h>


  class string

  {

  private:

    int size;

    char *ptr;

 

  string() : size(0), ptr(new char[1]) { ptr[0] = 0; }

 

    string(const string &s) : size(s.size)

    {

      ptr = new char[size + 1];

      strcpy(ptr, s.ptr);

    }

 

    ~string()

    {

      delete [] ptr;

    }

 

    friend ostream &operator <<(ostream &, const string &);

    string &operator=(const char *);

  };

 

  ostream &operator<<(ostream &stream, const string &s)

  {

    return(stream << s.ptr);

  }

 

  string &string::operator=(const char *chrs)

  {

    if (this != &chrs)

    {

      delete [] ptr;

     size = strlen(chrs);

      ptr = new char[size + 1];

      strcpy(ptr, chrs);

    }

    return(*this);

  }

 

  int main()

  {

    string str;

 

    str = "Hello World";

    cout << str << endl;

 

    return(0);

  }

骨灰级程序员写的代码

代码语言:javascript
复制
  [

  uuid(2573F8F4-CFEE-101A-9A9F-00AA00342820)

  ]

  library LHello

  {

      // bring in the master library

      importlib("actimp.tlb");

      importlib("actexp.tlb");

 

      // bring in my interfaces

      #include "pshlo.idl"

 

      [

      uuid(2573F8F5-CFEE-101A-9A9F-00AA00342820)

      ]

      cotype THello

   {

   interface IHello;

   interface IPersistFile;

   };

  };

 

  [

  exe,

  uuid(2573F890-CFEE-101A-9A9F-00AA00342820)

  ]

  module CHelloLib

  {

 

      // some code related header files

      importheader(<windows.h>);

      importheader(<ole2.h>);

      importheader(<except.hxx>);

      importheader("pshlo.h");

      importheader("shlo.hxx");

      importheader("mycls.hxx");

 

      // needed typelibs

      importlib("actimp.tlb");

      importlib("actexp.tlb");

      importlib("thlo.tlb");

 

      [

      uuid(2573F891-CFEE-101A-9A9F-00AA00342820),

      aggregatable

      ]

      coclass CHello

   {

   cotype THello;

   };

  };
 

  #include "ipfix.hxx"

  extern HANDLE hEvent;

  class CHello : public CHelloBase

  {

  public:

      IPFIX(CLSID_CHello);


      CHello(IUnknown *pUnk);

      ~CHello();


      HRESULT  __stdcall PrintSz(LPWSTR pwszString);

 

  private:

      static int cObjRef;

  };

 
  #include <windows.h>

  #include <ole2.h>

  #include <stdio.h>

  #include <stdlib.h>

  #include "thlo.h"

  #include "pshlo.h"

  #include "shlo.hxx"

  #include "mycls.hxx"


  int CHello::cObjRef = 0;


  CHello::CHello(IUnknown *pUnk) : CHelloBase(pUnk)

  {

      cObjRef++;

      return;

  }

 

  HRESULT  __stdcall  CHello::PrintSz(LPWSTR pwszString)

  {

      printf("%ws

", pwszString);

      return(ResultFromScode(S_OK));

  }


  CHello::~CHello(void)

  {

 

  // when the object count goes to zero, stop the server

  cObjRef--;

  if( cObjRef == 0 )

      PulseEvent(hEvent);

 

  return;

  }

 

  #include <windows.h>

  #include <ole2.h>

  #include "pshlo.h"

  #include "shlo.hxx"

  #include "mycls.hxx"


  HANDLE hEvent;


   int _cdecl main(

  int argc,

  char * argv[]

  ) {

  ULONG ulRef;

  DWORD dwRegistration;

  CHelloCF *pCF = new CHelloCF();

 

  hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

 

  // Initialize the OLE libraries

  CoInitializeEx(NULL, COINIT_MULTITHREADED);

 

  CoRegisterClassObject(CLSID_CHello, pCF, CLSCTX_LOCAL_SERVER,

      REGCLS_MULTIPLEUSE, &dwRegistration);

 

  // wait on an event to stop

  WaitForSingleObject(hEvent, INFINITE);

 

  // revoke and release the class object

  CoRevokeClassObject(dwRegistration);

  ulRef = pCF->Release();

 

  // Tell OLE we are going away.

  CoUninitialize();

 

  return(0); }

 

  extern CLSID CLSID_CHello;

  extern UUID LIBID_CHelloLib;

 

  CLSID CLSID_CHello = { /* 2573F891-CFEE-101A-9A9F-00AA00342820 */

      0x2573F891,

      0xCFEE,

      0x101A,

      { 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 }

  };

 

  UUID LIBID_CHelloLib = { /* 2573F890-CFEE-101A-9A9F-00AA00342820 */

      0x2573F890,

      0xCFEE,

      0x101A,

      { 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 }

  };

 

  #include <windows.h>

  #include <ole2.h>

  #include <stdlib.h>

  #include <string.h>

  #include <stdio.h>

  #include "pshlo.h"

  #include "shlo.hxx"

  #include "clsid.h"

 

  int _cdecl main(

  int argc,

  char * argv[]

  ) {

  HRESULT  hRslt;

  IHello        *pHello;

  ULONG  ulCnt;

  IMoniker * pmk;

  WCHAR  wcsT[_MAX_PATH];

  WCHAR  wcsPath[2 * _MAX_PATH];

 

  // get object path

  wcsPath[0] = '\0';

  wcsT[0] = '\0';

  if( argc > 1) {

      mbstowcs(wcsPath, argv[1], strlen(argv[1]) + 1);

      wcsupr(wcsPath);

      }

  else {

      fprintf(stderr, "Object path must be specified\n");

      return(1);

      }

 

  // get print string

  if(argc > 2)

      mbstowcs(wcsT, argv[2], strlen(argv[2]) + 1);

  else

      wcscpy(wcsT, L"Hello World");

 

  printf("Linking to object %ws\n", wcsPath);

  printf("Text String %ws\n", wcsT);

 

  // Initialize the OLE libraries

  hRslt = CoInitializeEx(NULL, COINIT_MULTITHREADED);

 

  if(SUCCEEDED(hRslt)) {

 

 

      hRslt = CreateFileMoniker(wcsPath, &pmk);

      if(SUCCEEDED(hRslt))

   hRslt = BindMoniker(pmk, 0, IID_IHello, (void **)&pHello);

 

      if(SUCCEEDED(hRslt)) {

 

   // print a string out

   pHello->PrintSz(wcsT);

 

   Sleep(2000);

   ulCnt = pHello->Release();

   }

      else

   printf("Failure to connect, status: %lx", hRslt);

 

      // Tell OLE we are going away.

      CoUninitialize();

      }

 

  return(0);

  }

菜鸟黑客写的代码

代码语言:javascript
复制
  #!/usr/local/bin/perl

  $msg="Hello, world.\n";

  if ($#ARGV >= 0) {

    while(defined($arg=shift(@ARGV))) {

      $outfilename = $arg;

      open(FILE, ">" . $outfilename) || die "Can't write $arg: $!\n";

      print (FILE $msg);

      close(FILE) || die "Can't close $arg: $!\n";

    }

  } else {

    print ($msg);

  }

  1;

有经验的黑客写的代码

代码语言:javascript
复制
  #include <stdio.h>

  #define S "Hello, World\n"

  main(){exit(printf(S) == strlen(S) ? 0 : 1);}

资深黑客写的代码

代码语言:javascript
复制
  % cc -o a.out ~/src/misc/hw/hw.c

  % a.out

骨灰级黑客大师写的代码

代码语言:javascript
复制
  % echo "Hello, world."

新任的初级经理写的代码

代码语言:javascript
复制
  10 PRINT "HELLO WORLD"

  20 END

中级经理写的代码

代码语言:javascript
复制
  mail -s "Hello, world." bob@b12

  Bob, could you please write me a program that prints "Hello, world."?

  I need it by tomorrow.

  ^D

高级经理写的代码

代码语言:javascript
复制
  % zmail jim

  I need a "Hello, world." program by this afternoon.

公司CEO写的代码

代码语言:javascript
复制
  % letter

  letter: Command not found.

  % mail

  To: ^X ^F ^C

  % help mail

  help: Command not found.

  % damn!

  !: Event unrecognized

  % logout

看完不同级别程序员的代码之后,你是不是也有所触动呢?上面的例子可能有点宽泛,接下来我们就集中在Go语言,看看不同级别的程序员都是怎么样写代码的?

初级Go语言程序员写的代码

代码语言:javascript
复制
package fac

func Factorial(n int) int {
	res := 1

	for i := 1; i <= n; i++ {
		res *= i
	}

	return res
}

功能性Go语言程序员写的代码

代码语言:javascript
复制
package fac

func Factorial(n int) int {
	if n == 0 {
		return 1
	} else {
		return Factorial(n - 1) * n
	}
}

通用Go语言程序员写的代码

代码语言:javascript
复制
package fac

func Factorial(n interface{}) interface{} {
	v, valid := n.(int)
	if !valid {
		return 0
	}

	res := 1

	for i := 1; i <= v; i++ {
		res *= i
	}

	return res
}

多线程优化的Go语言程序员写的代码

代码语言:javascript
复制
 package fac

import "sync"

func Factorial(n int) int {
	var (
		left, right = 1, 1
		wg sync.WaitGroup
	)

	wg.Add(2)

	pivot := n / 2

	go func() {
		for i := 1; i < pivot; i++ {
			left *= i
		}

		wg.Done()
	}()

	go func() {
		for i := pivot; i <= n; i++ {
			right *= i
		}

		wg.Done()
	}()

	wg.Wait()

	return left * right
}

利用Go设计模式的程序员写的代码

代码语言:javascript
复制
package fac

func Factorial(n int) <-chan int {
	ch := make(chan int)

	go func() {
		prev := 1

		for i := 1; i <= n; i++ {
			v := prev * i

			ch <- v

			prev = v
		}

		close(ch)
	}()

	return ch
}

利用成熟的Go解决方案写的代码

代码语言:javascript
复制
package fac

/**
 * @see https://en.wikipedia.org/wiki/Factorial
 */
type IFactorial interface {
	CalculateFactorial() int
}

// FactorialImpl implements IFactorial.
var _ IFactorial = (*FactorialImpl)(nil)

/**
 * Used to find factorial of the n.
 */
type FactorialImpl struct {
	/**
	 * The n.
	 */
	n int
}

/**
 * Constructor of the FactorialImpl.
 *
 * @param n the n.
 */
func NewFactorial(n int) *FactorialImpl {
	return &FactorialImpl{
		n: n,
	}
}

/**
 * Gets the n to use in factorial function.
 *
 * @return int.
 */
func (this *FactorialImpl) GetN() int {
	return this.n
}

/**
 * Sets the n to use in factorial function.
 *
 * @param n the n.
 * @return void.
 */
func (this *FactorialImpl) SetN(n int) {
	this.n = n
}

/**
 * Returns factorial of the n.
 *
 * @todo remove "if" statement. Maybe we should use a factory or somthing?
 *
 * @return int.
 */
func (this *FactorialImpl) CalculateFactorial() int {
	if this.n == 0 {
		return 1
	}

	n := this.n
	this.n = this.n - 1

	return this.CalculateFactorial() * n
}

高级Go语言程序员写的代码

代码语言:javascript
复制
package fac

// Factorial returns !n.
func Factorial(n int) int {
	res := 1

	for i := 1; i <= n; i++ {
		res *= i
	}

	return res
}

类似于Rob Pike宗师级程序员写的代码

代码语言:javascript
复制
package fac

// Factorial returns !n.
func Factorial(n int) int {
	res := 1

	for i := 1; i <= n; i++ {
		res *= i
	}

	return res
}

原文链接:

https://www.ariel.com.au/jokes/The_Evolution_of_a_Programmer.html

https://github.com/SuperPaintman/the-evolution-of-a-go-programmer#the-evolution-of-a-go-programmer

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/B4DhP9Qay1blS18qMcEG
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券