소프트웨어의 품격 (자바로 살펴보는 좋은 소프트웨어 개발)

소프트웨어의 품격 (자바로 살펴보는 좋은 소프트웨어 개발)

$35.00
Description
프로그래밍 언어의 기본을 익힌 독자를 대상으로 하는 책으로, 소프트웨어의 품질을 결정짓는 여러 가지 기준과 그 기준에 부합하는 소프트웨어를 개발하는 방법을 예제 바탕으로 설명한다. 더 나아가, 품질 기준 사이에 필연적인 충돌이 있음을 이해하고, 이러한 기회비용을 어떻게 다뤄야 할지 생각해볼 기회를 제공한다.
저자

마르코파엘라

MarcoFaella
이탈리아네이플스페데리코II대학조교수로재임중이다.그의연구분야는컴퓨터과학이지만열정적인강사이자프로그래머이기도하다.지난13년동안고급프로그래밍강의를해왔고자바자격증참고서를출간했으며자바스트림영상강의도만들었다.

목차

1부.먼저알아야할것들

1장.소프트웨어품질과앞으로풀어야할문제
1.1소프트웨어품질
1.1.1내적품질과외적품질
1.1.2기능적품질과비기능적품질
1.2외적소프트웨어품질에가까운기준들
1.2.1정확성
1.2.2견고성
1.2.3사용성
1.2.4효율성
1.3내적소프트웨어품질에가까운기준들
1.3.1가독성
1.3.3테스트용이성
1.3.4유지보수성
1.4소프트웨어품질기준사이의상호작용
1.5특수한품질
1.5.1스레드안전성
1.5.2간결성
1.6앞으로살펴볼예제:수조시스템
1.6.1API
1.6.2활용사례
1.7데이터모델과데이터표현
1.7.1물의양저장하기
1.7.2연결상태저장하기
1.8Hellocontainers![Novice]
1.8.1필드와생성자
1.8.2getAmount와addWater메서드
1.8.3connectTo메서드
요약
더읽을거리

2장.레퍼런스구현
2.1레퍼런스코드[Reference]
2.1.1메모리레이아웃다이어그램
2.1.2메서드
2.2메모리요구사항
2.2.1Reference의메모리요구량
2.3시간복잡도
2.3.1Reference의시간복잡도
2.4배운내용연습하기
요약
퀴즈와연습문제정답
더읽을거리


2부.소프트웨어품질

3장.질주본능:시간효율성
3.1상수시간에물넣기[Speed1]
3.1.1시간복잡도
3.2상수시간에연결추가하기[Speed2]
3.2.1순환리스트로그룹표현하기
3.3.2갱신지연
3.3최적의균형:합집합찾기알고리즘[Speed3]
3.3.1그룹대표찾기
3.3.2수조의트리연결하기
3.3.3최악의경우의시간복잡도
3.3.4분할상환시간복잡도
3.3.5크기가변하는배열을이용할경우의분할상환분석
3.4구현방식비교하기
3.4.1실험
3.4.2이론대실제
3.5전혀새로운문제에적용해보기
3.5.1빠른삽입
3.5.2빠른조회
3.5.3모든것을빠르게
3.6실제사례
3.7배운내용적용해보기
요약
퀴즈와연습문제해답
더읽을거리

4장.소중한메모리:공간효율성
4.1검소한버전[Memory1]
4.1.1공간및시간복잡도
4.2일반배열[Memory2]
4.2.1공간및시간복잡도
4.3객체여,안녕[Memory3]
4.3.1객체를사용하지않는API
4.3.2필드와getAmount메서드
4.3.3팩토리메서드로수조생성하기
4.3.4ID로수조연결하기
4.3.5공간및시간복잡도
4.4블랙홀[Memory4]
4.4.1공간및시간복잡도
4.5공간-시간기회비용
4.6전혀새로운문제에적용해보기
4.6.1중복이적을때
4.6.2중복이많을때
4.7실제사례
4.8배운내용적용해보기
요약
퀴즈와연습문제해답
더읽을거리


5장.모니터링을이용한신뢰성향상
5.1계약에의한설계
5.1.1사전조건과사후조건
5.1.2불변조건
5.1.3정확성과견고성
5.1.4계약검사
5.1.5더큰그림
5.2계약을바탕으로수조설계하기
5.3계약을검사하는수조[Contracts]
5.3.1addWater의계약검사하기
5.3.2connectTo의계약검사하기
5.4불변조건을검사하는수조[Invariants]
5.4.1connectTo에서불변조건검사하기
5.4.2addWater불변조건검사
5.5전혀새로운문제에적용해보기
5.5.1계약
5.5.2기본구현
5.5.3계약검사
5.5.4불변조건검사
5.6실제사례
5.7배운내용적용해보기
요약
퀴즈와연습문제해답
더읽을거리

6장.나를속여봐:테스트를이용한신뢰성향상
6.1테스트의기본적개념
6.1.1테스트커버리지
6.1.2테스트와계약에의한설계
6.1.3JUnit
6.2수조테스트하기[UnitTests]
6.2.1테스트초기화하기
6.2.2addWater테스트하기
6.2.3connectTo테스트하기
6.2.4테스트수행
6.2.5커버리지측정
6.3테스트용이성[Testable]
6.3.1제어가능성
6.3.2관측가능성
6.3.3고립하기:의존성제공
6.4전혀새로운문제에적용해보기
6.4.1테스트용이성개선
6.4.2테스트슈트
6.5실제사례
6.6배운내용적용해보기
요약
퀴즈와연습문제해답
더읽을거리


7장.큰소리로코딩하자:가독성
7.1가독성을바라보는관점
7.1.1기업코딩스타일가이드
7.1.2가독성의재료
7.2구조적가독성특징
7.2.1제어흐름구문
7.2.2표현식과지역변수
7.3외부적가독성특징
7.3.1주석
7.3.2이름짓기
7.3.3공백과들여쓰기
7.4가독성높은수조[Readable]
7.4.1자바독을이용한클래스헤더문서화
7.4.2connectTo정리하기
7.4.3addWater정리하기
7.5가독성에대한마지막고찰
7.6전혀새로운문제에적용해보기
7.7실제사례
7.8배운내용적용해보기
요약
퀴즈와연습문제해답
더읽을거리


8장.스레드안전성
8.1스레드안전성달성의어려움
8.1.1동시성레벨
8.1.2수조시스템의동시성정책
8.2교착상태다루기
8.2.1원자적락시퀀스
8.2.2순서있는락시퀀스
8.2.3숨은경합조건
8.3스레드안전한수조[ThreadSafe]
8.3.1connectTo동기화
8.3.2addWater와getAmount동기화
8.4불변성[Immutable]
8.4.1API
8.4.2구현
8.5전혀새로운문제에적용해보기
8.6실제사례
8.7배운내용적용해보기
요약
퀴즈와연습문제해답
더읽을거리


9장.재활용합시다:재사용성
9.1경계찾기
9.2일반적인프레임워크
9.2.1속성관리API
9.2.2가변컬렉터
9.2.3함수형인터페이스를컨테이너속성에적용하기
9.3제네릭컨테이너구현
9.4일반적인고려사항
9.5수조의기능재현하기[Generic]
9.5.1수정된시나리오
9.5.2구체적인속성설계
9.5.3구체적인수조클래스정의
9.6소셜네트워크포스트
9.7전혀새로운문제에적용해보기
9.7.1파라미터화된함수를표현하는인터페이스
9.7.2통신방식개선
9.8실제사례
9.9배운내용적용해보기
요약
퀴즈와연습문제해답
더읽을거리

부록A.코드골프:간결성
부록B.궁극의수조클래스

출판사 서평

◈추천의글◈

지난30년동안프로그래밍서적몇권을저술한덕분에책을쓰는일에관한조언을요청받곤한다.그때마다우선한장(chapter)을완성해보여달라고요청하는데대부분그후로소식이없다.한장도쓰지못한다면책한권은완성될수없고더이상할얘기도없기마련이다.
2018년2월네이플대마르코파엘라교수로부터이메일을받았다.그가캘리포니아대에서일하던시절만난적이있었다.그는책저술에대한조언을구했는데이미몇장이완성된상태였다!살펴본내용이마음에들어몇가지조언과격려를담아답장을보냈다.그후한동안연락이없었지만놀랍지는않았다.알고지내던한편집자가말했듯이저술을시작하는사람은매우많지만저술을끝마치는사람은드물기때문이다.
2019년4월매닝출판사로부터그의책이출간된다는이메일을받았는데정말훌륭한책이었다.8월에는그가내게머리말을부탁해흔쾌히승낙했다.(코어자바같은고전적인)
프로그래밍언어관련책을쓸때는언어의구성요소와특화된API에집중한다.그리고독자가자료구조와알고리즘,(테스팅과리팩토링,디자인패턴을비롯한)소프트웨어공학이론을한번쯤접했다고가정한다.하지만교수가된후대학교육과정이이러한주제를실용적이고쉽게가르치지못한다는사실을깨달았다.
이책은그러한부족함을채워준다.자바프로그래밍의기본에만익숙하다면저자가고품질프로그램을향한길을제시할것이다.여러분이알고리즘설계,API설계,테스팅,동시성에경험이있을수있지만저자는고전적인주제에새로운관점을제시한다.
저자는한예제를다른방식으로계속구현하면서엄청나게많은통찰을끌어낸다.나는이렇게‘실제로돌아가는예제’를가지고설명하는방식을좋아하지않는다.예제프로그램이진화하는과정을파악하기위해책을꼭순서대로읽어야하기때문이다.하지만이책의예제는영리하게설계됐다.놀랍고흥미로운핵심개념몇가지를첫눈에이해한후각장에서독립적인방향으로코드를발전시킨나간다.이는놀라운경험이될것이다.
중요한내용을다루는장을읽은후‘이전과완전하게다른뭔가’를발견할것이다.그랬다면새로운기술을다른상황에적용할차례다.본문중간의퀴즈와각장끝부분의연습문제를꼭풀어보길바란다.
고품질소프트웨어를만드는일은결코간단하지않다.하지만훌륭한설계이론과장인정신을다시되새기는것은항상도움을준다.내가그랬듯이여러분도이책에서제시하는신선한관점을즐겨보길바란다.
-케이호스트만(CayHorstmann),
초보와숙련된프로그래머를위한수많은책(『CoreJava』시리즈,『ModernJavaScriptfortheImpatient』등)의저자

◈이책에서다루는내용◈

◆소프트웨어품질평가
◆소프트웨어품질기준의기회비용과상호작용
◆한가지예제를바탕으로다양한목표달성
◆어떠한객체지향언어에도적용할수있는자바기반예제


◈이책의목표와대상독자◈

공식적인교육을받지못한주니어개발자가소프트웨어개발의시야를넓히는시작점으로적합하다.
◆공식적인교육이부족하거나컴퓨터과학,컴퓨터공학외의다른분야를전공한현업개발자는이책을통해컴퓨터과학과컴퓨터공학의기법을훑어보고실제프로그래밍과업에서근본적으로상충하는가치를살펴볼수있다.
◆컴퓨터과학과컴퓨터공학전공생에게는별도강의에서배운다양한주제를통합하는사례를제공한다.프로그래밍과소프트웨어공학교과서의보충교재로사용할수있다.


◈이책의구성◈

각장에서어떠한관점의코드품질을다루는지다음과같이요약했다.각장끝부분의연습문제를그냥지나치지말자.상세한해답을제공하며해당장에서다룬기법을다른상황에적용해핵심개념을완성해나갈수있다.
1장에서는프로그래밍예제(수조클래스)를설명하고경험이부족한프로그래머에게나쁜영향을미치는일반적인오해를보여주는사례를살펴본다.
2장에서는여러가지관점에서균형잡힌품질을제공하는레퍼런스구현을자세하게살펴본다.
3장에서는시간효율성에초점을맞춰레퍼런스실행시간을수백배(500배)줄여본다.상황에따라여러가지성능기준사이에충돌이발생하는것을설명한다.
4장에서는공간(메모리)효율성을실험한다.객체를이용해레퍼런스대비50%의메모리사용량을절감한다.그리고수조를표현하는데‘객체’를사용하지않음으로써90%의메모리를절감한다.
5장에서는모니터링을기반으로신뢰성을보장하기위해규약에따른설계방법론을소개하고메서드규약과클래스불변조건에기반한런타임체크와어서션을이용해레퍼런스를
견고하게만드는방법을살펴본다.
6장에서는단위테스트로신뢰성을향상한다.코드커버리지측정을비롯한각종도구를이용해클래스의테스트슈트를설계하고실행하는기법을알아본다.
7장에서는가독성을다룬다.명료한자기설명적코드의모범사례를따라레퍼런스를리팩토링한다.
8장에서는동시성과스레드안전성을살펴본다.스레드동기화와관련있는기본적인개념을되새겨보고예제를바탕으로교착상태와경합조건을피하는데복잡한기법이필요하다는것을확인한다.
9장에서는재사용성에집중한다.유사한구조를지닌다른문제에레퍼런스클래스를활용할수있게제네릭을이용한일반화를실습한다.
부록A에서는간결함을주제로,레퍼런스코드길이의15%정도로짧은구현방식을살펴본다.
부록B에서는가장중요한소프트웨어품질기준을통합해궁극의수조클래스를작성한다.

◈옮긴이의말◈

초등학교시절부모님을조르고졸라다녔던컴퓨터학원에서GW-BASIC으로검은색바탕에회색텍스트로ASCII아트를그리며놀던기억이난다.지금생각하면별것아니지만당시는그게정말재미있고자못자랑스러웠다.그때는그게왜그리도재미있었을까?아마도아무제약이없었기때문이아닐까?재촉하는영업부서도,결제가안된다며불만을토로하는고객도,예산을꼬치꼬치캐묻는관리부서도없고,그저그리고싶은대로화면에그리면그만이었다.
그후대기업과스타트업이라는극단적인환경에서소프트웨어를개발하면서뼈저리게느낀점은소프트웨어를개발하는일에는항상제약이따른다는것이다.소프트웨어는정신적노동의결과물인동시에돈을받고팔려야하는‘상품’이기때문이다.즉소프트웨어개발은근본적으로비즈니스라는문맥을벗어나생각할수없기때문에항상시간과예산,인력등의비용제약을수반한다.
소프트웨어엔지니어로서항상겪는갈등도여기서비롯된다.모든면에서완벽한소프트웨어를만들고싶은욕심과주어진비용안에서과업을완수해야하는제약사이에충돌이발생한다.결국인생의많은측면이그렇듯소프트웨어개발에도완성도와제약사이의적절한균형이필요하다.무엇을취하고무엇을버릴지,무엇을먼저하고무엇을미뤄야할지끝없는선택의연속이다.한마디로기회비용을항상고려해야만한다.
이책의중요한주제중하나가바로기회비용이다.저자는소프트웨어의품질을결정하는여러기준을소개하고동일한소프트웨어를여러측면에서최적화하는방법을탁월하게설명한다.그리고그과정에서각기준사이에불가피한기회비용이있는것을보여준다.
프로그래밍언어의기본적인내용을익힌개발자라면이책에서크게2가지를얻을수있다.첫째,소프트웨어의품질을결정하는여러기준을이해하고그기준에부합하는소프트웨어를개발하는방법을살펴볼수는있다.물론책한권읽는것만으로는고품질의소프트웨어를작성할수없지만이책을좋은출발점으로삼을수있을것이다.
둘째,여러품질기준사이에필연적인충돌이있다는것을이해하고이러한기회비용을어떻게다룰지생각할기회를얻는것이다.물론책내용만으로현실에서발생하는모든충돌을이해할수는없다.현실의소프트웨어개발은품질기준뿐만아니라사업적,조직적요소까지영향을미치므로훨씬복잡하다.그래도이상적인생각만으로전쟁터에뛰어들기보다마음의준비를단단히하고뛰어드는것이나을것이다.
인생이그렇듯훌륭한개발자,엔지니어의길도순탄치만은않다.가보지않은길에어떠한괴물이도사리고있을지알수없다.그저배우고성장하며묵묵히걸어갈뿐이다.부디여러분의앞길에이책이작은이정표가되기를바란다.