Go 언어 강좌 1

Developer/GO 2016/01/29 18:46

미국와서 취직도 안되고, (사실 지원도 1월 이후로 안하고 있어요 ㅋ)
하던차에 Google 느님들이 만드신 Go 언어를 독학하고 있는데...
이 언어 대박입니다!

제가 대박이라 하는 이유는...
- 자바와 같은 멀티 OS기반입니다.
- 코드가 간결합니다.
- C같은 Native compile이 됩니다.
- 별도 VM을 돌리지 않습니다.
- Node.js 나 PHP 처럼 웹서버에 탑재되는게 아니라, 웹서버를 만들고 컨텐츠를 작성할 수 있습니다.
- C와 연동이 됩니다.
- iOS / Andoroid 다됩니다. 참고 : http://www.sitepoint.com/ios-and-andro ··· th-go%2F
- library도!!! https://talks.golang.org/2015/gophercon-go-on-mobile.slide#1


이정도면 배워둘만 하지 않을까요?

앞으로 많은 회사들이 Go로 서버 만들거 같은 느낌이 드네요.
그래서, Unity3D와 Go로 서버만드는 걸 목표로 공부하면서, 과정을 남기려 합니다.

1. 설치
저는 윈도우와 OSX를 사랑하기 땜시, 그냥 윈도우에서 실행할 수 있는 Go를 다운로드 받았습니다.
공식사이트 : https://golang.org/
다운로드 : https://golang.org/dl/

윈도우는 다운로드 후 실행하면 끝!

2. 설치확인
- 윈도우 10기준으로 좌측하단 "웹 및 Windows 검색" 입력창에 cmd 입력, 명령 프롬프트 실행
- 그 이하에서는 직접실행 창에 cmd.exe 입력후 엔터
- 시커먼 명령 프롬프트 창이 열리면 "go"라고 입력해서 실행되는지 확인

* 실행결과

사용자 삽입 이미지

3. 에디터 선정
Visual Studio에서도 plugin을 설치하면 "Go"언어 지원을 받을 수 있지만,
저는 Notepad++을 사랑하기 때문에 이걸 기준으로 설명합니다.

다른 에디터 지원 목록 : https://github.com/golang/go/wiki/IDEsAndTextEditorPlugins
Visual Studio 사용자는 여기로 : https://marketplace.visualstudio.com/items?itemName=lukehoban.Go

- Notepad++ : https://notepad-plus-plus.org/ 에서 다운로드
다운로드후 실행하면 설치 끝.

이제 Notepad++가 "Go"를 인식할 수 있도록 Plugin을 설치할 차례입니다.
(그냥 해도 되지만, Syntax highlight와 Function, Auto Complete 기능은 기억력 감퇴중인 늙은 개발자에게 필수죠)

- Plugin : https://github.com/chai2010/notepadplus-go

다운로드 후에 압축해제하고
- userDefineLang.xml 파일을 "%AppData%\Notepad++" 폴더에 복사
- 먼저 "%AppData%\Notepad++\functionList.xml"파일을 열어두고, 압축파일에 있는 "functionList.xml"파일을 열어서 해당 XML코드를 복사해서 아까 열어둔 원본 functionList.xml 파일 안에 <parsers>~</parsers> 안에 붙여 넣기
- 압축파일에 있는 go.xml 파일을  "{Notepad++에 설치경로}\plugins\APIs"에 복사
- userDefineLang.xml 파일을 열어서 "<NotepadPlus>"와 "</NotepadPlus>" 테그 부분에 주석 처리 (<!-- //-->) 된 부분을 주석 해제후 저장
- Notepad++이 실행중이라면 종료후 재실행

4. Hello World 작성
Notepad++에서 다음과 같이 코드 작성
package main
 
import "fmt"
 
func main() {
    fmt.Printf("hello, world")
}


* 산뜻하게 Syntax highlight 까지 적용
사용자 삽입 이미지

확장자는 ".go"로 임의 폴더에 저장

5. 실행
해당 소스가 있는 폴더로 이동후

go run helloWorld.go 실행
사용자 삽입 이미지

6. Native 빌드
위의 경로에서
go build helloWorld.go 실행후 helloWorld.exe 실행
사용자 삽입 이미지


7. 한글코딩해보기
모국어로 코딩할 수 있는 환경을 사랑합니다! (C# 빠가 된 이유중 하나입죠...)
현대 언어니까 당연히 UTF-8로 코딩해봐야 하지 않을까요?

package main
 
import "fmt"
 
func main() {
    초기화();
}

func 초기화() {
    fmt.Printf("안녕하세요?");
}


근데 Notepad++로 작업하면 이렇게 한글이 작게나와 불편합니다.

사용자 삽입 이미지
이건 Notepad++의 상단 메뉴 "설정"에서 "스타일" 클릭하시고...
다음 메뉴처럼 변경하면 간단히 해결됩니다.
사용자 삽입 이미지
* 짜잔~!
사용자 삽입 이미지
이제 아까와 같이 실행 해봅시다.
사용자 삽입 이미지
이 아이는 착한 아이입니다. 설마 Native compile 안될까봐 해봤습니다.
사용자 삽입 이미지

8. 함수 확장해보기
한글 함수가 되는걸 확인했으니 이제 함수형태를 확장 해보겠습니다.

package main
 
import "fmt"
 
func main() {
    인사하기(5); 
}

func 인사하기(_x int) {
    if _x%2 == 0 {
        fmt.Printf("안녕하세요?");
    } else {
        fmt.Printf("아님 말고");
    }
    if _x > 0  { 
        인사하기(하나씩까기(_x));
    } 
}

func 하나씩까기(_x int) int {
    _x = _x - 1 ;
    return _x;
}


흔하디 흔한 재귀함수입니다.
(영어로 재귀함수를 뭐라 부르는지 몰라서 인터뷰때 "재귀함수 적용할까?" 물어 보지 못한게 한이 되어 앞으로 꾸준히 사용할겁니다. 엉엉 T_T)

사용자 삽입 이미지
여기서 신기한건
- fmt.Printf 와 같이 메소드명 첫글자가 대문자이면 Public 타입 (외부 엑세스 가능)
(한글 코딩하면 규칙에 위배되니 여기까지만 한글 코딩할께요.)
- fmt.Printf 대신 fmt.Println 사용하면 행 자동 바꿈.
- 타입을 항상 뒤에 둔다는 것.
- Function이 다음과 같이도 정의될 수 있다는 것.
func 테스트기능(_x int) (int, int) {
    return 0, 1;
}




다음에는 웹서버 한번 만들어 봅시다.

2016/01/29 18:46 2016/01/29 18:46

미국 살기_4

Memory 2016/01/16 09:30
간만에 올리네요. 새해 복 많이 받으세요!
적응기 안쓴 연말에 이사하고, 짐정리하고 하다보니 벌써 입국한지 60일이 좀 안되는 시점이 되었습니다.




뭐 암튼 몇일동안 사이에 지난번에 Santa monica 면접본 회사는 언리얼 한다는데 자꾸 유니티 언급해서 떨어지고, (아마도 더 많은 이유가 있었겠지만..)

* 처음 이사오고 나서 장만한 TV 다이입니다.
사용자 삽입 이미지

* 한국에서 붙인 이삿짐이 1월 9일에 드디어 도착했어요.
사용자 삽입 이미지
총 87개 박스를 다 풀어서 대충 정리하는데만 3일. 일평균 10시간 정도 걸렸습니다. OTL..
정리할 가구가 아직 도착하지 않아 (새로 주문 했습니다. 이케아꺼 싼거 2번 사보고 도저히 이건 쓰면 안되겠다는 허접한 품질이 가장 눈에 먼저 띄더군요)
아직도 정리할 박스가 8개 정도 남아 있습니다.

암튼, 새로 이사온 동네는 코리안 타운입니다. 크리딧문제와 직업문제가 있어 제대로된 아파트 (교외에 사람적고 범죄률 낮아서 차가 덜 막히는 동네에, 좋은 학생들이 있는 학교 근처) 는 구하질 못해 다운타운 근처 코리안 타운으로 왔습니다. (자유 이민의 부작용 되겠슴돠)

* 그래도 여긴 천조국.. 집근처 다른 집을 보면 으리으리~~!!! 하게도 마치 판타지 RPG INN을 보는듯한...
사용자 삽입 이미지

새롭게 이사온 LA다운타운 근처에서 유니티 개발자 채용한다는 공고를 몇일동안 보일때 마다 두들겨 보았더니..
다행히 LA 다운타운에 몇몇 회사에 일자리가 있어 resume를 넣고 linkedin에 정보 업댓하면서 몇일을 보냈던거 같아요.

* Linkedin 정보
https://www.linkedin.com/in/shinhyunmin

처음 인터뷰했을때를 회고해보면...
버벅버벅이는 영어로 인해 원할하게 제가 가지고 있는 능력을 어필하지 못했다는 생각이 들었고,
코딩 Test도 없어서 살짝 멘붕오기도 했습니다.

몇일 첫 인터뷰를 꼽씹으며 시간을 보내던중 드디어 인터뷰보자는 회사에서 연락이 왔고, 어제 인터뷰를 보았습니다.
첫 인터뷰때의 교훈이 있었기에 인터뷰 전날 저를 설명하는 자료를 만들었습니다.

인터뷰전 소개자료
https://www.dropbox.com/s/foyett316knk42v/Presentation.pptx?dl=0

처음 인터뷰장에 들어갔을때 영국친구 한명과 독일친구 한명 총 2명과 인사를 하고 인터뷰를 진행했는데...
"영어가 부족해서 자료를 만들어왔다. 시간을 달라"고 요청했고, 그 분들 역시 이력서 한장 가지고 따지기 보다는 뭐 만들어왔다니.. (사실 빔프로젝터도 들고 갔습니다.)
보자고 해서 위의 링크된 자료로 프리젠테이션을 했습니다.

(인간은 역시 도구의 동물입죠... 넵)

다행히 일반적인 프로젝트 검증은 화이트보드와 준비한 자료로 충분히 설명했습니다.
(인터뷰 끝날때쯤 프리젠테이션은 훌륭했다.(i seen nice presentation about u) 라고 하더군요.)

하지만, 문제는 코딩시험이었습니다.

1차 면접때 VFX에서 코딩시험을 보지 않아 머릿속 가득 VFX회사는 코딩시험을 보지 않을꺼야라고 생각하고 있었는데.. 갑작이 웃고 즐거운 가운데 코드 테스트하자고 하더니, 다음의 문제를 줬습니다.

1. Linked list class를 만드세요.
이건 간단하게 Class 하나 만들어서 금방 만들었지만, 메모리가 너무 커지는것 아닌가?라는 지적을 받았고, 불필요한 Arguments를 그 자리에서 제거함으로써 해소할 수 있었습니다.

2. 위에 만들어진 클래스에 다음의 데이터가 있다고 생각하고 C Value를 삭제하면 하위 Tree에 있는 Value를 삭제하는 로직을 짜보세요.

화이트보드 코딩중에 끊임없이 여긴 왜 이렇게 했는가? 저긴 왜 저렇게 했는가? 하는 압박을 하더군요.
(이건 시각에 따라 다르지만 좋은 인터뷰 방법인것 같습니다. 왜냐하면 같이 일하면서 서로 녹아들수 있어야 하는데 딴지 걸릴때마다 머리에 부하가 걸리면서 식은 땀이 줄줄줄 흐르면서 당황하게 되니 밑바닥 실력이 들어납니다!)

암튼 아주 더티하고도 부끄러운 코드를 작성했고, 저는 테스트 해보기전이지만, 원하는대로는 작동할 것이다.라고 했지만, 너무 엉성한 코드에 짜증이 올라 왔습니다.

집에와서 다시 코딩했고, 오늘 아침에 재귀호출 함수를 추가해서 개선하였습니다.



using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;


namespace TestCode
{
    class Program
    {
        static void Main(string[] args)
        {
            List<NodeClass> _LinkedNode = new List<NodeClass>();
            SetNode(_LinkedNode);
            #region For Debug (Input data check)
            //foreach (NodeClass _n in _LinkedNode)
            //    Console.WriteLine("Parent:{0}, Value:{1}",_n._Parent, _n._value);
            #endregion

            RemoveValue(_LinkedNode, "A");

            #region For Debug (Input data check)
            foreach (NodeClass _n in _LinkedNode)
                Console.WriteLine("Parent:{0}, Value:{1}", _n._Parent, _n._value);
            #endregion
            Console.ReadLine();
        }

        static void SetNode(List<NodeClass> _LinkedNode)
        {
            string[] _Values = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" };
            foreach (string _value in _Values)
                _LinkedNode.Add(new NodeClass
                {
                    _Parent =
                    ((_value == "B") ? "A" :
                    (_value == "C") ? "A" :
                    (_value == "D") ? "A" :
                    (_value == "E") ? "B" :
                    (_value == "F") ? "C" :
                    (_value == "G") ? "C" :
                    (_value == "H") ? "D" :
                    (_value == "I") ? "F" :
                    (_value == "J") ? "F" :
                    ""),
                    _value = _value
                });

        }
        static void RemoveValue(List<NodeClass> _LinkedNode, string _X)
        {
            foreach (NodeClass _n in _LinkedNode)
            {
                if (_n._value == _X) _n._value = "";
                if (_n._Parent == _X) RemoveValue(_LinkedNode, _n._value);  
            }
        }
    }

    public class NodeClass
    {
        public string _Parent { get; set; }
        public string _value { get; set; }
    }

}


코드가 아직도 흠이 많습니다. 특히 변수명과 메소드명은 뚜렷하게 현지인들이 식별하기 어려운 상태예요.
이 부분이 아마도 제 약점 같네요.

여기와서 유명 회사에 다니시는 지인분들께 들은 정보에 의하면,

- 회사는 가능하면 Human Resource에 투자할 여력이 있는 회사에 지원할 것.
(제가 생각을 해도 한참 잘못한거 같더군요. 큰 회사일 수록 여유가 있으니 당연히 조금은 여유있게 사람을 뽑는다 하더군요.)
- 회사는 항상 Negotiation 가능한 인재를 찾으니 고집피우지 말것.
- 회사 채용기준은 3가지임.
  . smart : 기본지식이 튼튼하고 해당 도메인 지식과 경험이 있는 인재
  . diligence : 열정을 쏟아 낼 수 있는 인재
  . culture fit (friendly) : 회사 문화에 맞는 인재

매번 느끼는 거지만, 한국과 너무 다른 문화 때문에 정신을 못차리겠습니다.
- 작은 회사에서 먼저 적응하고 큰 회사로 옮기려 했는데, 처음부터 큰회사로 지원하는게 취업은 상대적으로 더 쉽다.
(왜냐하면 작은 회사는 당장 성과 낼 수 있는 준비된 인재가 필요하고, 큰 회사는 키워서 성과 낼 수 있는 인재라도 괜찮음. 즉, 작은 회사나 큰 회사나 급여차이는 별로 없음. 금전적 이유로 따지자면 작은회사가 스톡옵션으로 대박날 확률이 더 큼)
- 영어는 못해도 할 수 있는 모든 도구를 활용하여 커뮤니케이션을 더 원할히 하는게 중요함

문화에 적응하는게 이론처럼 담담히 받아들여지질 않네요.

그럼에도 영주권이 드디어 집으로 배송됐네요! =) 크하하하..
사용자 삽입 이미지
2016/01/16 09:30 2016/01/16 09:30
* 다음의 내용에 대해 어떠한 책임도 지지 않습니다.

- 개발자 취업은 여기 참조 바랍니다. 저도 열독하고 공부중입니다.
. 미국 개발자의 일반적인 삶을 엿볼수 있습니다 :  http://ppss.kr/archives/8197
. 전반적인 취업 과정입니다 : http://theyearlyprophet.com/interviews ··· ion.html* 한국도 그렇지만, 미국도 인맥임돠. 인맥 없으면 꽝이예요.

흙수저인데 진짜 한국을 떠나고 싶다. 영주권을 획득하는게 문제가 아니라, 여기 미국땅에 와보니
1. 영어가 발목 잡습니다.
2. 서바이벌 영어 된다해도 크리딧 시스템 때문에 아무것도 못합니다.
(한국 은행이 담보를 요구한다면 여기 미국은 크리딧입니다. 월세방 구하는데에도, 핸드폰 개통하는데도 모든게 크리딧이 있어야 가능합니다.)

- 유학을 와서 학비를 카드로 결재하면 물론 크리딧 쌓입니다. 하지만, 학생 종료후 일정 기간내에 직업을 못구하면 다시 헬조선으로 돌아가야 합니다.
- 부모 등뼈 꺽을 정도의 재력이면 그냥 헬조선에 사세요.
- 다음은 흙수저 최단기 시민권 획득 코스입니다.

바로 "미군" 입대입니다.
미군에 입대하면서 시민권 신청 해두면 높은 확률로 시민권 취득이 가능합니다.
(현역 3년, 예비군 5년 복무입니다.)

단, 이경우 22개월 이상 미국에 체류하고 있어야 신청이 가능합니다.
그리고 단 2개 병과만 지원이 가능하다고 하니 될 가능성이 낮죠.

22개월동안 손가락 빨기 어렵다면 라디오코리아, 코리안 타운 교차로, 미주 중앙일보 등에 실려 있는 "취업이민 희망자", "비자후원가능" 등으로 검색하면,
3순위 취업 비자 (EB-3) 취득이 가능한 업체 광고가 나옵니다. (물론 사기가 많으니 조심! 또 조심)

다시 계산해서
- 3순위 취업비자 받고 24개월 보내면 월급받고 어쩌구 해서 크리딧 쌓으면서 영주권 획득
- 영주권 획득과 동시에 군입대하며 시민권 지원후 3년
- 총 5년 보내고 나면, 제대군인 지원 프로그램으로 대학학비 면제, 취업우선권 부여 등 각종 혜택을 받을 수 있습니다.

다시 말씀드리지만, 저 역시 흙수저이고, 저는 운이 좋아서 IT직종으로 이민왔지만, 지금 후회 엄청 하고 있습니다.

- 크리딧이 없어서 암것도 못하는 상황이거든요!

또 다시 말씀드리지만, 이 방법은 최악의 상황에 빠질수 있고 저 역시 책임 못집니다.
절대 책임 못지니 "이민 가고 싶으시면, EB3 알아보세요."
(저는 차라리 맥도날드나 농장에서 일하는 EB3였다면, 지금 당장 최소한의 생활비 걱정이나 크리딧 걱정은 덜 할거 같습니다.)

* 저희 3인가족 월 생활비 공개합니다.
- 1Bed / 1 Bath / 1 Parking 되는 한인 타운 (크리딧 없어도 들어갈 수 있는곳) : 1600불
- 차량 구입 / 운용비 / 보험료 : 600불 (대중교통이 황이라서, 차가 없으면 못움직여요)
- 식대 / 유틸리티 비용 등 기초 생활비 : 2000불
- 교육비 : 1000불

총 5,200불 (가만히 앉아서 멍때리면 나가는 고정비용입니다.)
- 이상황에서 직업없고, 크리딧 없으면 우케 될지 생각해보시는게 좋을 것 같네요.
2015/12/27 10:12 2015/12/27 10:12