# 저자 소개:
vczh, 본명은 Chen Zihan입니다. Zhihu의 개인 정보에는 "전문 휠 빌더"라고 적혀 있기 때문에 세상 사람들은 그를 "휠 브라더"라고 부릅니다. ". vczh는 대학 시절 Microsoft에서 인턴으로 일했으며 졸업 후 즉시 Microsoft에 입사했습니다. 저는 Microsoft Shanghai에서 시작하여 나중에 베이징의 Microsoft Research Asia에 입사했습니다. 현재 그는 미국 시애틀로 이주하여 Office 팀에서 엔지니어로 일하고 있습니다.
사람들은 나에게 Microsoft에 어떻게 가는지 자주 묻곤 했습니다. 사실 이 질문에 대해 생각해 본 적이 없었기 때문에 당시 대답은 자연스럽게 마이크로소프트의 광고(프로그래밍을 잘하고, 수학을 잘하고, 태도가 좋다)였다. 제가 대학 4학년이던 2009년, 미국 서브프라임 모기지 사태가 우리에게 닥쳤고, 이로 인해 우리처럼 미국 회사에 가고 싶어하는 사람들이 착취당하기가 더욱 어려워졌습니다. 다행히 5번의 시험을 통과하고 6명의 장군을 물리치고 마침내 인턴십을 마치고 남게 되었습니다. 이것의 원인과 결과는 며칠간의 인터뷰만으로는 확실히 판단할 수 없으므로 hello world부터 시작해야 합니다.
# 중학교
저는 운이 좋게도 중학교 2학년 때부터 프로그래밍을 배웠습니다. 그 당시 세상은 이미 현대적인 수준이었습니다. 운영체제에는 가상 메모리, 그래픽 인터페이스, 인터넷, 개발 소프트웨어 및 통합 개발 환경이 갖춰져 있었습니다. 일부 옛날 타이머에서 설명했듯이 프로그램을 컴파일하려면 디스크를 여러 번 교체해야 했습니다. .날이 완전히 다릅니다.
컴퓨터를 구입한 지 반년이 지났고, 보는 모든 것이 너무 궁금했습니다. 게다가 그 당시 아버지는 제가 게임을 하는 것에 동의하지 않으셨기 때문에 제가 직접 몇 가지 게임을 만들까 생각하고 있었습니다. 공개적으로 할 수 있다는 것입니다. 그래서 산터우 화교 중학교에서 Visual Basic 5.0 수업을 제공한다는 소식을 듣고 매우 기뻤습니다. 하지만 첫 컴퓨터 수업에 너무 신나서 자전거를 너무 빨리 타고 피를 많이 흘리고 이가 몇 개 빠졌던 날에 비하면 그 설렘의 정도는 무시할 수 있습니다.
21세기의 첫 해는 인터넷 접속 비용이 극도로 비싸고 Google이 막 시작했고 프로그래밍을 배우는 것이 지금보다 훨씬 더 어려웠다는 것을 아는 사람이 거의 없었습니다. 지식을 찾을 때 인터넷은 기본적으로 절망적이어서 서점에 가는 취미를 갖게 되었습니다.
"Visual Studio 고급 그래픽 프로그래밍 튜토리얼"이라는 책을 찾는 데는 그리 오랜 시간이 걸리지 않았습니다. 저는 이 책을 매우 좋아합니다. 그림이 매우 아름답고, Visual Basic 프로그래밍을 사용하여 그려져 있어서 도저히 내려놓을 수가 없습니다. 아쉽게도 내용이 너무 고급스러워서 나중에 중학교 3학년 때 독학으로 초보적인 3차원 해석기하학을 배웠고, 수업시간에 강의를 듣지 않았다는 이야기도 있었습니다. 고등학교 3학년 때 혼자 수학적 분석에만 의존했는데, 나중에서야 이해하게 됐어요.
중간에 프로그래밍을 이용해서 복잡한 그래픽을 많이 그리고 이미지에 다양하고 복잡한 변형을 하려고 했기 때문에 프로그램을 작성하기 전에 종이에 긴 공식을 추론해야 했습니다. 프로그램의 실행 결과가 잘못된 경우 디버깅할 방법이 없으므로 오류가 발생한 이유를 설명하기 위해 수식에서 몇 가지 버그를 찾기를 바라면서 다시 파생시켜야 합니다.
그때부터 나는 기호 연산을 아주 잘하게 되었습니다. 게다가 수학이나 물리학 숙제를 하거나 프로그래밍을 통해 공식을 도출하다 보면 계산할 게 너무 많고, 여기저기 종이 쪼가리 찾아보기도 귀찮아서 복잡한 과정을 정신적으로 계산하는 능력을 갖게 되었어요. 지금은). 이것은 또한 나에게 유익을 가져다 주었다. 즉, 대학 입학 시험의 객관식 수학 문제에 대한 모든 답을 서류가 배부 된 후 10 분 이내에 작성이 허용되지 않은 상태에서 정신적으로 계산되었으며 모두였습니다. 옳은.
오랫동안 그래픽 프로그래밍을 하다가 원래의 이상이 생각나서 게임을 시작하게 되었습니다. 그때 청두 금핀 실무그룹이 개발한 '마나의 영웅들'을 보고 RPG 개발에 대한 열정이 불타올랐습니다. 여러번의 실패를 겪은 끝에 드디어 고등학교 2학년 음력 1월 1일에 "천지전"의 코딩 작업을 모두 완료하고 얼마 지나지 않아 GameRes 홈페이지에 올렸습니다.
이것은 10,000줄이 넘는 나의 첫 번째 프로그램입니다. 성공적으로 완성하기 위해 왜 객체지향인지, 상호의존성을 줄이기 위해 모듈을 나누어야 하는 이유 등 많은 사실을 배웠습니다. 이것은 또한 나중에 나만의 그래픽 인터페이스와 스크립트 엔진을 개발할 수 있는 기회가 되었습니다. 나중에는 OpenGL을 이용해 3D 게임을 만들려고 했으나 공통 관심사를 갖고 함께 작업할 아티스트를 찾기 어려워 포기하게 됐다. 하지만 이로 인해 그래픽 인터페이스와 스크립트 엔진에 투자할 시간이 많이 생겼습니다.
나중에 고급언어를 설명하자는 생각이 떠올랐어요. 이것이 내 전체 프로그래밍 역사의 첫 번째 전환점이었습니다. 당시 저는 데이터 구조를 위해 연결 리스트만 사용했고, 컴파일 원리나 디자인 패턴에 대해서는 들어본 적이 없었습니다. 그 당시에는 고급 언어를 설명하는 것이 당연히 더 어려웠습니다. 그래서 며칠 동안 고민한 끝에 간단한 고급 언어를 어셈블리와 유사한 간단한 명령어 집합 언어로 재처리하는 원패스 컴파일(이 역시 매우 좋지 않음)이라는 방법을 생각해 냈습니다.
그 당시 저는 이미 고등학교 3학년이었기 때문에 실제로 프로그래밍에 투자할 시간이 별로 없었기 때문에 처음으로 만든 프로토타입은 델파이에서 개발한 단순화된 파스칼 인터프리터였습니다. 지금 생각해보면 메모리 누수나 성능 문제도 많았을 텐데 당시에는 이런 것들이 뭔지도 몰랐습니다. 고등학교 졸업 후 3개월의 공백 기간 동안 이걸 다시 디자인해서 수십 페이지에 달하는 계획서를 얻었습니다. 끝낼 시간이 없어서 인쇄해서 남중국공과대학교에 가져갔습니다.
#대학
대학에 입학한 지 불과 며칠 뒤, 담임 선생님이신 Chen Jian 선생님이 편집 원리를 가르치신다는 소식을 언니로부터 듣고 이 종이 뭉치를 보여 주었습니다. 그녀는 아무 말도 하지 않았고(지금 생각해보면 디자인이 정말 보기 흉했다고밖에 말할 수 없습니다...) 편집 원리에 대한 교과서를 저에게 주었습니다. 빨리 읽어보고 안에 있는 지식을 활용하여 최초의 실제 스크립트 엔진을 만들었습니다. 구문은 Java 언어의 간단한 일부를 복사하고 템플릿 매개변수를 자동으로 변경하는 기능도 추가했습니다. 객체 유형의 구문은 다음과 같습니다. 이름은 조브. 나중에 Java 수업을 들었는데 Java가 실제로 이런 일을 한다는 것을 알게 되었는데, 정말 이상한 느낌이 들었습니다.
나중에 나는 많은 스크립트 엔진을 차례로 작성했습니다. 제가 신입생이었을 때 만든 Jove는 여전히 인기가 있다고 생각되는 최초의 스크립팅 엔진이었습니다. 두 번째는 2학년 때 실패하고 많은 교훈을 얻은 후 3학년 때 개발한 동적 언어입니다. 이름은 Free입니다(제 블로그 http://www.cppblog.com/vczh에서 확인하실 수 있습니다). 최근에는 개발 중인 그래픽 카드 가속 GUI 클래스 라이브러리인 GacUI와 연동하기 위해 3.0으로 업데이트할 계획이다. 다음으로 Microsoft Shanghai의 WCFTools 그룹에서 인턴을 하는 동안 매일 밤 KernelFP라는 순수 함수형 언어를 완성했는데 이것이 나중에 졸업 프로젝트가 되었습니다.
졸업 프로젝트를 제출한 후 졸업하기 몇 달 전에 Cminus를 완료했습니다. 이것은 컴파일 원리 과정에서 설계된 매우 단순한 Cminus가 아니라 완전한 C 언어 컴파일러입니다(함수 포인터의 구문은 제가 변경했지만 여전히 지원됩니다). 컴파일 결과는 메모리에 저장된 X86 바이너리 코드 조각입니다. 함수의 시작 주소는 강제로 함수 포인터로 변환되어 C++ 프로그램에서 직접 사용될 수 있습니다. 이는 Visual C++의 일부 규칙을 따랐기 때문입니다. 지침을 생성할 때 규칙은 MSDN에 명확하게 설명되어 있습니다.
졸업 후 저는 제네릭과 개념 매핑을 갖춘 C 언어인 NativeX를 야심차게 구축했습니다. 몇 달 전에 C#을 복사하려고 했으나 C#이 너무 복잡해서 GacUI로 눈을 돌렸습니다. 나는 또한 많은 그래픽 인터페이스(GUI) 클래스 라이브러리를 작성했습니다. 고등학교 때 RPG용 제어 라이브러리 2개를 개발한 후, 대학에서 OpenGL을 사용하여 개발한 GUI 라이브러리 2개는 실패했습니다. 나중에 Windows API(Vczh GUI)가 한 번 캡슐화되어 VCL 또는 WinForm에 가깝게 사용하기 쉽도록 만들었습니다.
졸업 후에는 렌더링 기반 GUI를 여러 번 게시하려고 시도했고 아키텍처를 여러 번 변경했습니다. 지금 개발 중인 GacUI가 되어서야 제가 올바른 길을 가고 있다고 느꼈습니다. 이 과정에서 제가 내린 결론 중 하나는 Windows Presentation Foundation의 디자인이 정말 완벽하다는 것입니다. 이러한 작업 외에도 3차원 개체를 위한 세 가지 소프트웨어 렌더링 프로그램도 개발했습니다. 처음 두 개는 졸업 전에 완료했습니다. , 마지막 것은 1년 전에 여가 시간을 활용하여 삶을 풍요롭게 만드는 방법을 몰라서 시간을 죽이기 위해 개발되었습니다.
한 달 전 후배들이 잘 대답하지 못했던 질문에 대해 여기서 답을 드릴 수 있을 것 같습니다. Microsoft에서 일자리를 찾으려면 어떻게 해야 하나요? 왜냐면 제가 위에서 했던 일들을 이력서에 다 썼거든요. 동시에 4학년 때까지 묻지 않으면 이미 늦습니다...
제가 3학년 때 프로그래밍을 배울 수 있도록 기초가 거의 없는 두 학년 아래인 소프트웨어 대학 학생을 지도하기 시작했다는 점은 언급할 가치가 있습니다. 상대방이 탄탄한 C++ 기초와 능숙한 단위 테스트 작성 수준을 갖고, 3년간의 교육을 받은 후 직관적으로 나쁘지 않은 디자인을 생각해 낼 수 있도록 C++에 대한 많은 내용을 검토했습니다. 며칠 동안 여러 포인터 수업을 준비했는데 매일 과제가 있어요. 이 과정에서 프로그래밍 수준을 빠르게 향상시키려면 항상 할 수 있는 일을 해야 하는데, 그건 너무 어려워서 조금만 더 어려우면 할 수 없다는 걸 깊이 느꼈습니다. 이대로 몇 년 더 버티면 반드시 명인의 대열에 들어갈 것입니다.
그래서 숙제를 정리하는 과정에서 포인터에 대한 내용을 일부러 미뤘습니다. 먼저 상대방이 변수와 분기 루프를 받아들이도록 한 다음 좋은 스타일을 개발하고(예를 들어 항상 한 글자로 변수 이름을 지정할 수는 없는 등) 배열 조작 방법을 배우고 다음 단계는 포인터에 관한 것입니다. 강제 유형 변환 없이 몇 가지 작업을 수행하고 한 달 안에 단위 테스트를 통해 문자열 클래스를 만들었습니다. 포인터의 핵심은 '포인터 자체가 위치를 가리키는 숫자이다'라는 개념을 상대방이 깊이 이해하도록 하는 것이다. 이를 위해 포인터 뒤에 숨겨진 몇 가지 복잡한 개념을 설명하기 위해 전역 무한 길이 배열이 하나만 있는 어셈블리 언어를 특별히 설계했지만 구현하지는 않았습니다. 그 다음에는 객체지향, 디자인 패턴, 스크립트 엔진 관련 지식이 어느 정도 있습니다.
학생의 졸업 프로젝트는 간단한 동적 언어 스크립트 엔진이며, 스크립트 엔진의 구현은 제가 Linq를 모방한 목록 처리 함수 라이브러리를 올바르게 실행합니다. 이러한 클로저 구현은 서로 계층화되어 모든 객체에 삭제 기능을 추가하고 스크립트 엔진 구현을 테스트할 수 있는 다양한 지연 실행 반복기를 생성합니다. 상대방은 졸업 후 NetEase에 채용되어 치료 측면에서 인도적인 배려를 받았습니다.
내 프로그래밍 여정에는 여가 시간에 수행한 프로그램뿐만 아니라 Microsoft에서 인턴 및 근무하는 과정도 포함됩니다. 저는 고등학교 때 남중국공과대학의 마이크로소프트 동아리에 대해 듣고 어느 정도 마이크로소프트에 대한 동경을 갖고 있었습니다. 그래서 입학 후에는 본교 학생회 외에 꾸준히 돈을 내고 있었습니다. Microsoft Club에 관심을 기울이고 새로운 회원을 모집하고 다른 모든 협회를 무시하십시오. 하지만 솔직히 말해서 제가 학생회와 마이크로소프트 클럽에서 하는 일은 그저 부차적인 일에 불과했고 진지한 일은 한 번도 해본 적이 없습니다.
제가 대학교 2학년 때 마이크로소프트 검색기술센터(STC)가 마이크로소프트 클럽에 이력서를 모으러 왔을 때 앞서 언급한 담임선생님인 천지안 선생님을 길에서 만나 이 이야기를 했습니다. 나중에는 다른 사람들이 다 대학원생이라 너무 어리다고 해서 포기했어요. 제가 대학교 3학년이었을 때 Chen Jian 선생님이 옛 동창들에게 Microsoft 인턴십 이력서 제출을 도와달라고 부탁할 수 있다고 말씀해 주셔서 2008년 3월 Microsoft Shanghai로부터 전화 인터뷰를 받았습니다. 두 번의 전화 인터뷰가 있었습니다. 첫 번째는 HR 담당자와 진행되었고 두 번째는 소프트웨어 엔지니어와 진행되었습니다. 두 번째 전화 인터뷰에서는 위에서 언급한 Free에 대해 이야기를 나누었고, 일부 데이터 구조 및 프레임워크 설계 문제에 대해서도 열정적으로 토론했습니다. 며칠 안에 저는 면접 통지서를 받고 면접을 위해 상하이 민항구에 있는 Zizhu Digital Information Port에갔습니다. 그게 내 인생의 첫 인터뷰였다.
# 인턴십
Microsoft의 인터뷰 준비는 초 단위까지 정확하므로 일부 회사보다 훨씬 사용자 친화적이며 다른 사람의 시간을 낭비하지 않습니다. 인턴십을 위해 3차례의 면접이 있었고, 그 중 한 명만 외국인이었지만 대화는 모두 영어로 이루어졌습니다. 그 젊은 외국인과 인터뷰를 했을 때 너무 긴장해서 간단한 질문에도 적절한 대답을 하지 못했던 일이 아직도 어렴풋이 기억난다. 하지만 마침내 제가 상하이에 있는 Microsoft WCF 도구 팀에 인턴으로 합류할 수 있게 되었습니다.
이 팀에는 제가 매우 존경하는 소프트웨어 개발 관리자인 Ge Ziang 씨가 있습니다. 게 씨는 애자일을 사랑하고 애자일 실천에 자주 헌신하는 사람이다. 그는 4.5개월의 인턴십 동안 나에게 소프트웨어 엔지니어링에 대해 많은 것을 가르쳐 주었고, 나에게 가장 큰 도움이 되었던 것은 단위 테스트에 관한 것이었다.
또한 소스 코드 버전 관리 시스템(TFS 사용)을 기반으로 신속한 반복, 스크럼 미팅, 페어 프로그래밍, 다자 협업 개발 프로세스도 경험했습니다. TechEd 컨퍼런스를 위한 WCF 데모를 만들기 위해 PetShop을 수정하고, Visual Studio 2010의 WCF 개발 도구에 대한 버그를 수정하고, 확장성이 뛰어난 구성 파일 편집기를 개발한 후 2008년 12월에 Microsoft에서의 인턴십을 종료했습니다. 이 인턴십 이후 소스 코드를 제어하는 능력도 향상되었으며 이는 여가 시간에 개발하는 프로젝트의 코드 품질에 직접적으로 반영됩니다.
# 단골이 되세요
인턴십이 끝나기 전에 FTE(정규직 직원) 면접을 제안받았습니다. 당시 상황은 매우 심각했습니다. 2008년 미국 서브프라임 모기지 사태가 10월 마이크로소프트 상하이에 공식적으로 영향을 미쳤고, 마이크로소프트는 이 기간 동안 정규직 채용 인원을 줄이기로 결정했다. 저는 11월에 정규직 면접을 보았는데, 이 사건으로 인해 매우 긴장되었습니다. 나중에 Ge 선생님은 내가 졸업 후에도 계속 일할 수 있기를 바란다는 개인적인 제안을 하셔서 나에게 확신을 주었습니다.
인턴이 정규직이 되기 위한 면접은 총 5차례에 걸쳐 진행됩니다. 가장 인상 깊었던 점은 면접관이 한 라운드에서 매우 복잡한 질문을 많이 했고, 마지막으로 단서 이진 트리의 온라인 업데이트에 대한 질문을 했는데 구체적인 내용이 기억나지 않는다는 점이었습니다. 올바른 알고리즘을 생각해내는 데 오랜 시간이 걸리고 나면 시간이 지나고 화이트보드에 코드를 작성할 시간이 없었다는 것만 기억합니다. 나중에 나는 마침내 면접에 합격했고, 마침내 몇 안되는 자리 중 한 곳을 빼앗겼다. 하지만 몇 달 뒤에는 규제가 완화될 테니 면접 때처럼 어렵지는 않을 거라고 들었습니다.
인턴십과 인터뷰 과정에서 저는 중국 남이공대학교 소프트웨어 학부에서 제공하는 많은 강좌, 특히 데이터 구조, 디자인 패턴 및 소프트웨어 테스트에 대한 강좌가 실제로 매우 유용하다고 느꼈습니다. 이것들은 업무에 매우 유용한 지식이며, 향후 업무에서도 이러한 것들에 대한 경험을 지속적으로 축적하는 것도 필요합니다. 단지 그 대학에는 학생 수가 많고, 새로운 대학에는 항상 교사가 부족하기 때문에 많은 반 친구들이 교과서에 언급된 내용의 역할을 이해하기 어렵다고 말했습니다. 아마도 그 시절보다 지금 상황이 훨씬 나아졌을 것입니다.
#Microsoft SQL Server
면접이 끝나고 제안을 받기까지 수십일이 걸렸고, 마침내 새해 전날 HR의 최종 통지가 도착했습니다. 그 후 6개월 동안 나는 학교에서 나만의 일을 계속했고 가끔 경험 등을 소개하는 몇 가지 활동에 참여하고 몇몇 사람들과 놀러 나갔습니다. 졸업 후 그는 상하이에 있는 마이크로소프트로 떠났다. 중간에 일이 생겼는데, 할당량 변경으로 인해 WCF Tools 제안을 받았지만, 최종적으로 SQL Server 그룹에 배정되기 전에는 알림을 받지 못했습니다. 저는 데이터베이스를 좋아하지 않고 SQL Server에 대해 거의 이해하지 못했기 때문에 SQL Server Management Studio(전설적인 "인터페이스"라고도 함)를 개발하는 데 1년 반을 보냈습니다. 이 기간 동안 저는 동료들과 함께 단위 테스트, 인터페이스 개발, 디자인 패턴, Linq 및 구문 분석기에 대한 지식을 전파했습니다.
올해 반의 경험으로 저는 많이 성장했습니다. 주로 인턴십에 비해 정식으로 일할 때는 항상 다른 팀, 회사, 민족, 국가 및 종족과 열정적이고 폭넓은 교류를 해야 하고, 또한 시간이 많이 걸립니다. 때로는 사회주의의 우월성을 경험하기 위해 미국으로 날아가야 할 때도 있습니다. 정식 소프트웨어의 인터페이스 부분은 운영 체제의 DPI 변경과 현지화 프로세스(대부분의 콘텐츠가 인터페이스의 텍스트를 다른 언어로 번역하는 것임)뿐만 아니라 인터페이스의 레이아웃도 매우 복잡합니다. 일부 텍스트가 손실되지 않도록 자동으로 조정되거나 버튼이 절반만 표시되고 다양한 유형의 장애인(특히 시력을 잃은 사람)을 돌봐야 하며 일부 런타임 인터페이스를 제공해야 합니다. -자동 테스트 팀이 작업을 완료할 수 있도록 복잡한 콘텐츠를 그립니다.
이 경험을 통해 엄격한 인터페이스를 개발하는 것이 얼마나 어려운지 느꼈습니다. 또 다른 느낌은 수요 변화에 관한 것입니다. 디자인 패턴의 존재는 요구 사항의 변화에 저항하는 것입니다. 저는 작업을 시작하기 전까지 이 사실을 이해할 수 없었습니다. 요구 사항이 크게 변경된 후에도 코드 전체가 여전히 아름답고 수정하기 쉽고 성능이 뛰어나며 안전할 수 있도록 소프트웨어 아키텍처를 잘 설계해야 합니다. 모든 변경 사항은 패치가 될 수 없습니다. 언제든지 코드를 전체적으로 좋게 만들려면 항상 리팩터링해야 합니다. 이 목표를 달성하려면 디자인 패턴을 능숙하게 사용하고 프로젝트를 개발해야 합니다.
다른 회사에 비해 Microsoft의 보기 드문 장점 중 하나는 소프트웨어를 천천히 완성하는 데 많은 시간을 제공한다는 것입니다. 물론 이 좋은 정의는 기능성과 유지 관리 가능성에 중점을 둡니다. 코드 조각이 작업을 빠른 속도로 완료하기 위해 매우 미묘한 방법을 사용하지만 너무 복잡해서 주석으로 전체를 작성하더라도 후속 유지관리자가 이해할 수 없는 경우 코드는 실용적인 가치가 없습니다. 좋은 코드는 디자인이 얼마나 똑똑하고, 알고리즘이 얼마나 발전했는지가 아니라, 10년 동안 수천 명이 동시에 개발할 수 있고, 지속적으로 기능을 추가하는 과정에 있다는 점에서, 너무 혼란스러워지지 않을 것입니다. 이로 인해 다시 작성해야 합니다.
# 취업 홉업
나중에 어떤 이유로 MSRA(Microsoft Research Asia)에 인사 이동을 신청했습니다. 2011년 1월, 매니저의 승인을 받은 후, 저는 연구소 면접을 보기 위해 상하이에서 베이징으로 갔습니다. 이번에는 아직 5차례의 면접이 남았습니다. 이번 면접은 어려웠습니다. 면접관 중 한 분이 제 이력서에서 컴파일러와 관련된 내용을 많이 발견하시고, strncpy 기능을 구현해 달라고 요청하셨습니다. 요구 사항은 메모리에 대한 CPU 액세스 횟수가 최소화되어야 한다는 것입니다. 여기에는 대역폭, 정렬 및 이진 바이트 이동 작업과 같은 다양한 문제가 포함됩니다. 방법 자체도 이미 매우 번거롭고 종이에 코드를 작성할 때 항상 실수가 불가피하기 때문에 아직 전체 프로그램 작성을 완료할 시간이 없습니다. 또 다른 면접관인 외국인도 어렸을 때 컴파일러에 관한 일을 했었는데, 면접 때 아무 질문도 하지 않고 기본적으로 한 시간 안에 다양한 알고리즘이나 문제점에 대해 이야기를 해서 놀랐다. 질문에 답을 해야 하니까 내가 알고 있던 지식이 다 드러났다. 그 후 나는 이 남자와 깊은 우정을 쌓게 되었습니다.
얼마 지나지 않아 이직 승인을 받았습니다. 상하이에서 SQL Server 팀의 단위 테스트 표준을 수립하는 등의 마무리 작업을 마친 후 2011년 4월 베이징으로 가서 공식적으로 Microsoft Research Asia의 회원이 되어 분산 시스템 연구와 관련된 작업을 수행했습니다.
#Microsoft Research Asia
연구소의 업무는 매우 특별합니다. 왜냐하면 저는 장기 프로젝트에 참여한 적이 없고 항상 소수의 연구원들과 함께 일해 왔기 때문입니다. 첫 번째 프로젝트는 주로 C/S 아키텍처 프로그램이 교착 상태에 빠질지 여부를 결정하고 프로그래머가 문제의 근본 원인을 이해하고 자신의 프로그램을 추가로 수정 및 디버깅하는 데 도움이 되는 일부 보고서를 제공하는 동적 분석 프로젝트입니다. 나중에 나는 그들을 따라 이미지 검색 엔진과 분산 그래프 데이터베이스를 구축했습니다. 떠나기 전에는 Microsoft 자체 지식 그래프 프로젝트 등의 데이터를 풍부하게 하기 위해 여러 크롤러를 구축하는 데 도움을 주었습니다.
지난 몇 년 동안 연구소에서 기술적 지식을 얻고 베테랑이 되는 방법을 배우는 것 외에도 여전히 주요 기술적 성장은 제가 개발한 프로젝트에서 비롯됩니다. 연구소의 구조는 복잡한(반드시 새로운 것은 아니지만) 기술을 다루는 것을 좋아하는 저와 같은 프로그래머에게 매우 적합합니다. 게다가 연구소의 직속 상사인 Zou Xin을 통해 저는 훌륭한 리더가 얼마나 중요한지 깊이 깨닫게 되었습니다.
쓴 지 4년 반 정도 됐어요. GacUI를 작성하는 원래 의도는 내 언어에 맞는 IDE를 만드는 것이었지만 C++로 파서를 작성하는 것이 재미있었습니다. 이전에 UI는 C#으로 작성되고 스마트 프롬프트 알고리즘은 C++로 작성된 프로젝트를 실험한 적이 있습니다.
나중에 나는 모든 것을 C++로 작성할 수 있다면 얼마나 좋을까라는 생각만 했습니다. 그러나 C++ GUI 라이브러리의 MVVM 지원은 쓰레기이므로 GacUI가 탄생했습니다. 하지만 GUI 라이브러리를 만드는 작업량이 사실 좀 무겁고, 좋은 개발 경험도 추구하고 있어서 오랫동안 작업해 왔습니다. 1.0은 올해 안에 출시되야 하는데...
GacUI를 개발하면서 지난 수년간 구축한 7개의 천상의 왕국 GUI 라이브러리에 대한 경험과 교훈을 정리했을 뿐만 아니라 크로스 플랫폼 클라이언트 프로그램을 최소 비용으로 개발하는 방법도 배웠습니다. 사실, 크로스 플랫폼 프로그램을 작성하는 것은 전혀 어렵지 않습니다. 왜 인터넷에서 그것에 대해 소란을 피우는 사람들이 그렇게 많은지 모르겠습니다. GacUI가 나에게 가져온 또 다른 이점은 기본적으로 디자인 패턴의 모든 내용을 검토했으며 크기가 크기 때문에 다양한 git 저장소 간의 부분 순서 종속성을 구체적으로 구현하는 작은 도구도 만들었다는 것입니다. 전체 저장소는 다른 저장소에서 직접 사용할 수 있도록 두 개의 파일로 패키지됩니다. 원래는 서브모듈을 사용해 보고 싶었지만 서브모듈은 트리 종속성만 구현할 수 있는데 이는 정말 좋지 않습니다.
GacUI는 마침내 이전에 배운 컴파일 원칙을 검토했습니다. 왜냐하면 XML을 컴파일하는 과정에서 GacUI는 실제로 모든 것을 스크립트 엔진의 바이트코드로 변환하기 때문입니다. 결국에는 스크립트를 직접 실행하거나 (개발 중인) 스크립트를 C++로 변환합니다. 그러므로 이를 이루기 위해서는 컴파일러를 작성하는 것이 불가피하고, 컴파일된 것은 C++의 클래스와 통신이 가능해야 하기 때문에 COM의 내용을 다시 한번 검토해 보았습니다. 같은 것을 만들었습니다.)
C++ 생성이 완료된 후에는 작년에 시작한 GacJS를 계속 작성하고, GacUI를 브라우저로 옮기고, 모든 측면에서 IDE를 실행할 예정입니다. C++가 적합한 영역은 광범위하고 심오합니다.
# 해외로 나가세요
제가 데이터베이스를 좋아하지 않아서 연구소로 이직했다고 말씀드리고 싶습니다. 그 결과 연구소에서는 제가 SQL Server 출신인 것을 보고 저를 위해 데이터베이스 관련 자료를 많이 만들어 주었습니다. 나중에 상사에게 다른 일을 할 수 있는지 물었습니다. 상사가 나에게 무엇을 하고 싶냐고 물었고, 나는 컴파일러 같은 것을 구해 보라고 말했다. 그래서 상사는 나중에 제가 다른 연구 기관에서 일하여 분산 그래프 데이터베이스에 대한 쿼리 언어를 만들도록 주선해 주었습니다. 하지만 이런 일은 시작하기가 매우 간단합니다. 빨리 끝내고 나서 저는 다시 데이터베이스 개발자가 되었습니다. 그래서 나는 진실을 깨달았습니다. 대부분의 연구 기관에는 내가 좋아하는 것이 없다는 것입니다.
그래서 몇 년이 지나면서 북경(초등)과 학원(부전공)에 대한 불만이 점점 커져가서 빨리 아내를 구하고 참여하게 되었습니다. 사실 일반 면접과 똑같습니다.
4. 그런 다음 인터뷰
6 .비자신청
이 과정에서 저는 한숨을 쉬었습니다. 미국 면접관들은 세상을 보지 못했을 뿐입니다. 경쟁의 압력이 너무 낮고 질문도 매우 쉽습니다. 그들은 중국에 머물면서 서로 만나야 합니다. 그렇지 않으면 미제국주의가 조만간 무너질 것입니다. 그런데 또 다른 측면은 오피스용 크로스 플랫폼 GUI를 만든 팀이 제가 만든 GacUI를 보고 꽤 좋다고 생각해서 무심코 인터뷰를 한 것 같아요.
중국과 미국의 인재 연봉은 큰 차이가 없지만, 미국 IT 지역의 주택 가격이 베이징, 상하이, 광저우와 비슷한 점을 제외하면 자동차와 자동차를 제외한 나머지는 미국에서는 전기제품 가격이 훨씬 더 비쌉니다. 전반적으로 행복도는 감소했습니다. 다행스럽게도 중국 IT가 발달한 지역의 대기오염은 너무 심각해서 이러한 단점을 상쇄할 뿐만 아니라, 가난해도 기분이 좋아질 수 있었습니다. 그래서 벽을 뛰어넘은 이후로는 더 이상 전자제품을 가지고 놀 시간이 없을 때 운전하고, 없을 때는 출근하는 게 너무 재미있어요.
물론, 돼지는 바람을 맞으면 날 수 있습니다. 분명히 다른 산업의 임금은 미국보다 중국이 훨씬 낮지만 프로그래머의 격차는 1~3배에 불과합니다. 물론 중국에는 사회주의 발전의 격차를 메우기 위해 전문적인 훈련을 받은 전문 프로그래머가 여전히 많이 필요합니다.
#Microsoft Office
이번에 이직을 하게 되었는데, 우연히 노키아에서 사람을 해고하고 싶어하는 마이크로소프트 사람을 만났는데, 그 결과 대부분의 팀이 할당량을 동결시켰고, 돈이 많은 오피스만이 사람을 채용할 수 있었기 때문에 어쩔 수 없었습니다. 사무실에 오려고. 원래 목표는 Edge용 JS 엔진을 구축하거나, VS 그룹에 가서 컴파일러 같은 것을 구축하는 것이었지만 너무 형편없어서 포기할 수밖에 없었습니다.
Office에서 일하면서 30년 동안 10,000명이 작성하고 하나의 저장소 스냅샷에 수백 기가바이트의 코드가 포함된 소프트웨어를 만드는 방법을 경험하게 되었습니다. 머신이 너무 비싸기 때문에 코드를 수정하면 로컬에서만 컴파일할 수 있습니다. 따라서 msbuild를 기반으로 만든 CI 세트에는 연결해야 하는 lib/dll의 코드도 포함되어 있습니다. 서버로 이동하여 현재 체크포인트의 컴파일된 캐시를 찾고 컴파일된 함수를 다운로드합니다. 따라서 가끔 빌드팜이 멈추는 날에는 네트워크 연결이 끊어져 로컬 컴파일을 할 수 없습니다.
# 에필로그
프로그래밍 여정을 돌이켜보면 아마도 학생시절부터 게임을 쓰기 시작했고, 게임 엔진을 쓰기 시작했고, 그다음에는 게임 엔진에 필요한 그래픽, GUI 라이브러리, 스크립트 엔진을 전문으로 다루다가 마침내 내 에너지로 인해 GUI 라이브러리를 탄생시켰을 것입니다. 그리고 컴파일러 장치. 처음 스크립트 엔진을 설계할 때 스크립트를 일시정지하는 방법에 대한 문제에 큰 관심을 기울였습니다. 사실 이는 기본적으로 게임의 요구에서 파생된 것이었습니다. 그래서 인간의 육체는 코루틴을 다양하고 이상한 구현으로 만들었습니다. 결국 정통적인 방법을 배우게 되어서 쉽게 풀 수 있었던 문제가 나중의 요구사항으로 인해 조금 더 복잡해졌습니다. 유형 시스템 콘텐츠), 코루틴을 구현하려면 무한히 복잡한 메서드가 필요합니다. 인간은 왜 서로에게 상처를 주는가?
일을 하게 되면 기본적으로
1. 원래는 Visual Studio를 구하려고 했었는데, 학생 때는 SQL을 별로 안 좋아했어요. 작업 내용에는 전문적인 데이터베이스 지식과 드래그 컨트롤을 배우는 내용이 포함되어 있습니다.
2. 하지만 몇 년 동안 일한 후에도 여전히 SQL이 마음에 들지 않아서 MSRA로 전환했습니다. 그 결과 MSRA는 제가 데이터베이스 작업을 할 수 있도록 최선을 다했습니다. 이 일이 싫어서 떠난 건 아닌 것 같은데...
3. 나중에는 뭐 어차피 컴파일러는 안 해도 되니 그냥 하자고 생각했어요. 컨트롤을 드래그하세요. 그래서 나는 Office 사람들에게 내가 GacUI를 만드는 데 얼마나 멋진지 보라고 말했습니다! 사무실 사람들이 말했어요, 젠장! 그래서 저는 팀에서 GUI가 아닌 부분을 담당하도록 채용되었습니다.
4. 반년이 지나고 사장님께서 일을 정리하기 시작하셨고, 아직 다른 일을 하는 걸 좋아한다는 걸 표현하는 방법이 생각났어요. 그래서 저는 마침내 예전에 하던 일, 즉 Office 프로그래머를 위한 내부 컴파일러를 개발하기 시작했습니다.
결국 나는 내가 좋아하는 일을 하게 됐다.
위 내용은 전설의 프로그래머 지후 휠 형제님, 이 글을 읽고 무릎을 꿇었습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!