안녕하세요 😀
유로띠 입니다 😉
실용주의 프로그래머
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 @@@@@@@
#@@@@@@@@@@@
'Books > 실용주의 프로그래머' 카테고리의 다른 글
5장. 구부러지거나 부러지거나 (0) | 2022.03.30 |
---|---|
4장. 실용주의 편집증 (0) | 2022.03.25 |
2장. 실용주의 접근법 (0) | 2022.03.20 |
1장. 실용주의 철학 (0) | 2022.03.19 |
실용주의 프로그래머 책 구매 인증 👍 (0) | 2022.03.18 |