3장. 기본 도구
반응형

안녕하세요 😀

 유로띠 입니다 😉

 

 

 

 

 

 

실용주의 프로그래머


TIL (Today I Learned)

3줄 요약

 

✏️  셸로 능률을 향상시키자. 잘하면 자동화도 할 수 있겠다.

✏️  버전관리는 정말 중요하고 git을 더 잘 다룰수 있도록 노력하자.

✏️  버그를 해결하는 것도 찾는 것도 능력이다.

 

DAY 3

오늘 읽은 범위: 3장 기본 도구

 

😉 책에서 기억하고 싶은 내용을 써보세요.

서론

🟢  도구는 여러분의 재능을 증폭한다. 언제나 일을 하는 데에 더 나은 방법이 없는지 살펴라 (P.104)

 

일반 텍스트의 힘 

🟢  우리가 수집하는 요구 사항은 지식이고, 우리는 그 지식을 설계와 구현, 테스트, 문서로 표현한다. (P.105)

🟢  일반 텍스트가 널리 쓰이는 이유.

지원 중단에 대한 보험 - 데이터가 남아 있는 한 그걸 사용할 기회가 찾아오기 마련이다. (P.107)

기존 도구의 활용 - 버전 관리 시스템에서 에디터, 명령 줄 도구에 이르기까지 컴퓨터 세계의 거의 모든 도구는 일반 텍스트를 다룰 수 있다. (P.108)

더 쉬운 테스트 - 도구를 만들 필요 없이 간단하게 테스트 데이터를 추가하거나 수정할 수 있다. (P.109)

 

셸 가지고 놀기

🟢  GUI의 장점은 WYSIWYG(: What You See Is What You Get), 즉 여러분이 보는 것이 여러분이 얻는 것이라는 점이지만, WYSIAYG(: What You See Is All You Get), 즉 여러분이 보는 것이 여러분이 얻는 전부라는 것이다. (P.111)

🟢  명령어 셸을 갖고 놀다 보면 오르는 생산성을 보며 깜짝 놀라게 될 것이다. (P.112)

🟢  소라게처럼 조개껍데기(shell) 그러니까 셸을 여러분의 집으로 만들어라 (P.113)

 

(이 소라게가 아니지...)

 

버전 관리

🟢  버전 관리 시스템(: version control system, VCS)은 일종의 거대한 '실행 취소' 키와 같다. (P.119)

🟢  버그 추적이나, 감사, 성능 관리, 품질 관리를 해야 할 때 매우 귀중하다. (P.120)

🟢  특정 릴리스를 찾거나 릴리스의 재생산, 장기간 보관하기에 탁월한 도구, 둘 이상의 사용자가 동일한 파일들을 동시에 작업 가능 (P.121)

🟢  언제나 버전 관리 시스템을 사용하라. (P.121)

 

디버깅

🟢  디버깅은 단지 문제 풀이일 뿐이라는 사실을 받아들이고, 그런 마음으로 공략하라. 문제를 고치는 데에 집중해야 한다. (P. 126)

🟢  버그가 여러분의 잘못인지 다른 사람의 잘못인지는 중요치 않다. 어쨌거나 그 버그를 해결해야 하는 사람은 여러분이다. (P. 127)

🟢  당황하지 말라. (P.127)

🟢  디버깅할 때 근시안의 함정에 주의하라. 표면에 보이는 증상만 고치려는 욕구를 이겨 내라. (P.127)

근시안의 함정에 주의하라.

🟢  우리가 해야 하는 일은 버그를 재현하는것이다. (P.129)

🟢  코드를 고치기 전 실패하는 테스트부터. (P.129)

🟢  그놈의 오류 메시지 좀 읽어라... 이 정도면 됐겠지? (P.130)

🟢  우리 둘 중 하나가 자신의 실수일 수 있는 일을 시스템의 문제라고 탓하기 시작하면 우리는 그 사건을 떠올리도록 'select 가 망가졌어'라는 표현을 사용한다. (P.135)

🟢  발굽 모양을 보면 말을 생각해야지 얼룩말부터 떠올리지 말라. (P.135)

🟢  놀라운 버그를 마주쳤을 때, 단순히 그걸 고치는 것을 넘어서 왜 이 문제가 더 일찍 발견되지 않았을까 생각해 봐야 한다. (P.137)

 

엔지니어링 일지

🟢  일지를 쓰면 좋은 점이 크게 세가지 있다.

기억보다 더 믿을 만하다.

하던 일을 돌아보기에 알맞은 기회가 생기는 것이다.

수년 전에 여러분이 무엇을 하고 있었는지 돌이켜 볼 수 있다.(P. 143)

 

 

🧐 오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요

오늘의 소감?

✅  셸을 잘 다루게 되면 능률이 오르는 건 확실하다.

최근 회사에서 상호명 변경에 따른 모든 소스의 이름 변경 작업이 필요하였는데, 직장동료분이 일괄 변경하는 셸을 작성하였고 순식간에 몇 만개나 되는 소스를 한 번에 수정할 수 있었다.

책을 읽고 공감이 많이 되는 내용이였고 개인적으로는 셸뿐만 아니라 엑셀도 잘 다룬다면 능률과 불필요한 단순 노동의 시간을 줄이고 일에 집중할 수 있다고 생각한다.

 

✅  버전관리는 중요하다.

이전 회사에서는 소스만 git으로 관리하였고 이외의 정보는 단순 공용 저장소에 파일을 보관하여 관리하였다.

파일로 버전을 관리하면 한 번쯤 이렇게 해봤을 것이다.

하지만 이것은 버전관리라 할 수 없고, 공동 작업도 못할뿐더러 누군가가 악의적인 마음으로(그럴 일은 없지만..) 삭제한다면 관리를 할 수 없다.

그래서 저는 직접 버전관리를 사내에 설치하여 배포했던 기억이 있다. 

내가 했던 고민이 책에 그대로 나와 공감이 되고 미리 이 책을 읽었더라면 그래서 모두가 버전 관리에 중요성을 알았더라면 더 빨리 실천했을 것이다.

 

✅  버그로 밤샌 사람이 한두명이 아닐 것이다.

나 역시도 인터넷도 할 수없는 추운 서버실에서 노트북을 연결하고 버그를 찾아 밤샌 적이 있다.

결국 정말 사소한 이유였고 그럴일 없다고 믿었던 곳에서 버그를 찾아서 해결하였다. (JDK가 문제였다.. 🤣)

이후 다양한 버그를 만나 해결을 하면서 생각한 것이 디버깅하고 해결하는 것 또한 개발자의 능력이라고 생각한다.

책에서처럼 버그에 당황하지 말고 버그가 누구 때문인지는 중요하지 않고 해결해야 하는 것도 본인이라는 것에 공감한다. 👍

 

✅  지금 책읽고 작성하는 것도 엔지니어링 일지의 한 부분이고 수년 후에 돌이켜 보면 뿌듯할 것 같다. 

 

 

🙋‍♂️ 궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.

궁금한 점?

⭐️  경계 조건(boundary condition) - P.129

 

에러인지 아닌지 경계가 되는 조건

 

CORRECT - 잠재적인 경계 조건을 기억하는데 도움을 준다.

 

[C]onformance(준수) : 값이 기대한 양식을 준수하고 있는가?

[O]rdering(순서) : 값의 집합이 적절하게 정렬되거나 정렬되지 않았나?

[R]ange(범위) : 이상적인 최솟값과 최댓값 안에 있는가?

[R]eference(참조) : 코드 자체에서 통제할 수 없는 어떤 외부 참조를 포함하고 있는가?

[E]xistence(존재) : 값이 존재하는가(널이 아니거나(no-null), 0이 아니거나(nonzero), 집합에 존재하는가 등)?

[C]ardinality(기수) : 정확히 충분한 값들이 있는가?

[T]ime(절대적 혹은 상대적 시간) : 모든 것들이 순서대로 일어나는가? 정확한 시간에? 정시에?

 

⭐️  체크섬(checksum) - P.108

중복 검사의 한 형태로, 오류 정정을 통해, 공간(전자 통신)이나 시간(기억 장치) 속에서 송신된 자료의 무결성을 보호하는 단순한 방법이다.

 

⭐️  grep - P.109

grep(그렙)은 유닉스를 위해 만들어진 텍스트 검색 기능을 가진 명령어이다. 

그 이름은 유닉스 ed의 명령어로 비슷한 기능을 수행하는 g/re/p에서 유래되었다.

global / regular expression / print에서 각각의 머릿글자를 따 온 것.

 

ex. etc 폴더의 하위 디렉토리를 탐색(-r)해서 backup이라는 단어를 포함하는 모든 것을 찾는다.

grep -r backup /etc

⭐️  perl - P.139

Perl로 만든 희한한 프로그램 😇

                                                       #
                                                   sub j(\$){($
                     P,$V)=                      @_;while($$P=~s:^
                 ([()])::x){                    $V+=('('eq$1)?-32:31
           }$V+=ord(  substr(                 $$P,0,1,""))-74} sub a{
          my($I,$K,$  J,$L)=@_               ;$I=int($I*$M/$Z);$K=int(
         $K*$M/$Z);$J=int($J*$M             /$Z);$L=int($L*$M/$Z); $G=$
         J-$I;$F=$L-$K;$E=(abs($          G)>=abs($F))?$G:$F;($E<0) and($
          I,$K)=($J,$L);$E||=.01       ;for($i=0;$i<=abs$E;$i++ ){ $D->{$K
                  +int($i*$F/$E)      }->{$I+int($i*$G/$E)}=1}}sub p{$D={};$
                 Z=$z||.01;map{    $H=$_;$I=$N=j$H;$K=$O=j$H;while($H){$q=ord
                substr($H,0,1,"" );if(42==$q){$J=j$H;$L=j$H}else{$q-=43;$L =$q
              %9;$J=($q-$L)/9;$L=$q-9*$J-4;$J-=4}$J+=$I;$L+=$K;a($I,$K,$J,$ L);
              ($I,$K)=($J,$L)}a($I,$K,$N,$O)}@_;my$T;map{$y=$_;map{ $T.=$D->{$y}
              ->{$_}?$\:' '}(-59..59);$T.="\n"}(-23..23);print"\e[H$T"}$w= eval{
              require Win32::Console::ANSI};$b=$w?'1;7;':"";($j,$u,$s,$t,$a,$n,$o
              ,$h,$c,$k,$p,$e,$r,$l,$C)=split/}/,'Tw*JSK8IAg*PJ[*J@wR}*JR]*QJ[*J'.
               'BA*JQK8I*JC}KUz]BAIJT]*QJ[R?-R[e]\RI'.'}Tn*JQ]wRAI*JDnR8QAU}wT8KT'.
               ']n*JEI*EJR*QJ]*JR*DJ@IQ[}*JSe*JD[n]*JPe*'.'JBI/KI}T8@?PcdnfgVCBRcP'.
                '?ABKV]]}*JWe*JD[n]*JPe*JC?8B*JE};Vq*OJQ/IP['.'wQ}*JWeOe{n*EERk8;'.
                  'J*JC}/U*OJd[OI@*BJ*JXn*J>w]U}CWq*OJc8KJ?O[e]U/T*QJP?}*JSe*JCnTe'.
                   'QIAKJR}*JV]wRAI*J?}T]*RJcJI[\]3;U]Uq*PM[wV]W]WCT*DM*SJ'.  'ZP[Z'.
                      'PZa[\]UKVgogK9K*QJ[\]n[RI@*EH@IddR[Q[]T]T]T3o[dk*JE'.  '[Z\U'.
                        '{T]*JPKTKK]*OJ[QIO[PIQIO[[gUKU\k*JE+J+J5R5AI*EJ00'.  'BCB*'.
                             'DMKKJIR[Q+*EJ0*EK';sub h{$\ = qw(% & @ x)[int    rand
                              4];map{printf  "\e[$b;%dm",int(rand 6)+101-60*   ($w
                               ||0);system(  "cls")if$w ;($A,$S)=    ($_[1],   $
                                _[0]);($M,   @,)= split  '}';for(     $z=256
                                ;$z>0; $z   -=$S){$S*=   $A;p @,}      sleep$_
                                [2];while   ($_[3]&&($    z+=$ S)       <=256){
                                p@,}}("".   "32}7D$j"     ."}AG".       "$u}OG"
                                ."$s}WG"    ."$t",""      ."24}("        ."IJ$a"
                                ."}1G$n"    ."}CO$o"     ."}GG$t"        ."}QC"
                                 ."$h}"      ."^G$e"    ."})IG"          ."$r",
                                 "32}?"       ."H$p}FG$e}QG$r".          "}ZC"
                                 ."$l",          "28}(LC" .""            ."".
                                 "$h}:"           ."J$a}EG".             "$c"
                                 ."}M"             ."C$k}ZG".            "$e"
                                 ."}"             ."dG$r","18"          ."}("
                                ."D;"            ."$C"  )}{h(16         ,1,1,0
                               );h(8,          .98,0,0   );h(16         ,1,1,1)
                               ;h(8.0         ,0.98,0,     1);         redo}###
                             #written                                 060204 by
                           #liverpole                                  @@@@@@@
                        #@@@@@@@@@@@

 

 

반응형