소프트웨어 트렌드의 변화 – SI to 알고리즘

SI의 시대에서 ~~~의 시대로 넘어오면서
(삑데이터, IOT, AI, 기타 솔루션, 모바일, 자체서비스 …)
알고리즘의 중요도가 더 높아진 것 같다.

기존 한국의 소프트웨어 산업은 영어의 원뜻과는 별 상관없는 것 같지만, SI라고 불리는 한 축을 중심으로 성장 해 왔다. 그리고 이 SI산업은 전통적인 여러 산업의 효율성을 증대시켜주고 2000년대 한국산업의 발전에 지대한 역할을 했다.
(개발자는 죽어났지만.. 거의 80년대 봉재노동자급… 중동 건설인부 = 일본캐나다 진출)
이 시기에는 시스템 성능을 높이기 위해서는 쿼리튜닝, 파일용량 낮추기, 네트워크와 컴퓨팅 파워 업그레이드가 더 중요했다. (자바-오라클의 시대)
개발 방법론도 효율적인 코딩보다 빠른 코딩이 대세였고… 그 흐름을 타고 순위권에 진입한 언어가 자바, 파이썬, 루비

SI의 업무분야는 대강 아래의 범주에 다 포함된다.
– 은행/카드/보험/증권 (차세대) 개발, 쇼핑몰, ERP연동, VOC
근데 이 산업군들은 이제 개발이 다 끝났다. 개선은 계속 이뤄지겠지만… 적어도 서비스를 구축하기에 급급하던 시절은 지났다.

근데.. 인터넷 왕폭발이 일어나고 10년쯤 지난 지금은? 좀 다르다.

이제 생각할 수 있는 것은 거의 다 만들어졌다.
이제는 ‘새로움’ 보다는 ‘나아짐’을 만드는 시대다.
서비스를 개선한다는 것은 비용을 낮추거나 사용편의성을 높이는 것일텐데…
같은 컴퓨팅 파워로 더 많은 일을 하려면 아키텍처/알고리즘의 개선.. 밖에 답이 없지 않을까?
– 서버1대 월 10만원에서 10%효율을 높이는 것은 쓸데없는 짓이지만… 1000대라면
기존에 운영되던 서비스들도 인터넷 인구가 늘면서 사용자가 많아지고 따라서 데이터양이 늘고.. 이로인해 기존에 겪어보지 못한 문제를 맞닥뜨리게 된다.

이런 배경에서 알고리즘의 중요성이 다시 대두되는 것 같다.

 

노가다 코딩의 시대의 종말

요즘은 뭘 해도 데이터가 많다. SI업무분야에 포함되는 업종들도 마찬가지…
예전엔 0.01ms의 차이가 별 것 아니었지만, 데이터양이 많아지다보니 이런 부분에서 더 큰 차이를 보인다.
라이브러리들도 많은 기능보다는 작고 빠른게 대세로 자리잡고 있다.
– PlayFramework, Flask와 같은 경량프레임워크의 약진
(그리고 라이브러리 뭐 있었는데 기억이 안난다)

 

이직 – 알고리즘

어느회사 이력서를 넣었다가 온라인 코딩테스트를 하길래…
ㅋ 뭐 얼마나 대단하길래? 라는 생각으로 1시간만에 하고 자야지~
하고 시작했다가.. 좌절을 맛봤다. 잠도 못자고…
그러고 나니 알고리즘에 대해 다시 생각을 해 보게 된다
… 되게 어려웠는데
이 회사 개발자가 몇명인데~ 여기 있는 다른개발자들은 이런문제 다 풀어내는건가?

취업 이후에는 계속 아키텍팅이나 구조분석/설계에만 집중을 했었는데…
시대가 변한 것 같으니 알고리즘도 공부를 해야하지 않을까 싶다.

책도 좋지만..
온라인 테스트 사이트가 다른사람하고 경쟁심도 생기고… 훈장도 받을 수 있고 하니 더 좋아보인다
다양한 언어를 지원 해 줘서 이미 풀었던 문제나 쉬운 문제를 새로 공부하는 언어로 다시 풀어보는 것도 도움이 될 것 같다.

 

사이트 목록은 여기서 퍼옴 http://ledgku.tistory.com/40

오일러 프로젝트

알고스팟

더블릿

코딜리티

https://codility.com/programmers

코드도장

탑코더

코드포스

해커랭크

 

Windows PowerShell, 윈도우 10을 쓰다보니…

윈도우10 쓰다가 우연히 발견했는데 …
쓰다보니 맘에들어 작업표시줄에 커맨드라인 대신 걸어놓고 쓴다.

CommandPrompt는 Dos의 콘솔창같은 느낌이라면 PowerShell은 LinuxTerminal의 좋은점을 좀 가져온 느낌이다. 색깔 때문인지 입력하는 느낌도 묘하게 다른게 많이 생소하다.
Gnu처럼 명령어도 좀 복잡한게 CommandPrompt보다 다양한 명령이 가능할 것 같다

실행은 두 가지 모드가 있던데 명령어 보이는 복잡한 창이랑.. 심플한 창이랑
뭐라고 명령어 입력하면 명령어 안내창이 나오기도 하던데…
일부러 공부할 생각은 없고.. 노가다성 작업이 필요할 때 마다 찾아보면서 하는게 좋지 않을까?

원래 윈도우 서버에서 쓰였던 것 같은데… 이제 이걸로 통합하려고 하는건가?

 

윈도우10 밑에 검색에 PowerShell 치면 나온다

 

 

UML – 프로젝트에 UML포함하기

이슈트래커나  프로젝트 문서 또는 소스코드에 프로젝트의 설계 관련 문서를 넣으면 좋을때가 있는데
여태까지는 진짜 적당한 프로그램이 없었다
대강 인터넷 찾아서 나오는 몇 가지 프로그램 비교해보면

argouml

몇번 써봤는데…
이건 제대로 돌아가지도 않는다… 느리고

StarUML

한국인이 개발한건데 이 사람이 개발포기한다고 어디서 글을 본 것 같은데…
GPL 라이센스 무료.. 원래 유료였는데 무료화에 소스공개하고 접은걸로 알고 있다.
근데 몇년전에 갑자기 v2가 나오고 v2는 어찌된건지 유료화가 됐다. GPL인데 유료화가 됐다면… 저작권을 매입한건가?
어쨌든 프로그램이 좀 불안정해서 안쓰게 됐다.

Visio

좋긴한데, 깔아서 쓰는사람이 별로 없고 설치도 힘들어서…
프로젝트에 포함시켰을 때 ide나 웹에서 봐지면 좋은데 그것도 아니고

PlantUML

최근 발견했는데 상당히 마음에 든다.
그림을 그리는 방식이 소스코드처럼 그려서 GIT에 관리하기도 편하고 용량도 얼마 안먹는다.
IDE플러그인에서 이미지 출력도 지원
중국계 오픈소스, GPL License인 것 같지만

http://plantuml.com/faq

I don’t like GPL!

You can also use:

라이센스가 모호하다.  맘대로쓰라는것같다.

X11, OSx에서는 완벽하게 돌아가지는 않나보다. 아직 윈도우에서만 써봐서…
컨셉이 나름 괜찮아서 커뮤니티가 활성화되면 나아지지 않을까 싶다.

사용하려면
http://plantuml.com/
이클립스, Intellij 플러그인을 설치하고 graphviz를 다운받은 후 설정에 써줘야한다.
C:/Program Files (x86)/Graphviz2.38/bin/dot.exe
뭘잡을지 잘 모르겠지?
dot.exe파일을 잡아줘야한다.

문법이 크게 복잡한것은 아니고…

클래스다이어그램은
UML만가지고 무슨 대규모 프로젝트 하는것도 아니고 잘해야 인터페이스 대여섯개정도 잡는정도니까

시퀀스 다이어그램은 순차적으로 가니 또 상관없을 것 같고….

디자인 패턴가지고 ClassDiagram 그려보고 있는데 괜찮은 느낌이다.

JVM기반 언어들, 쓸만한 녀석들을 골라보면

JVM은 버추어 머신으로 자바만을 돌리기 위한 플랫폼?이 아니고

자바는 컴파일시에 바이트코드를 생산하기 때문에 다른 언어들도 바이트코드로 변환할 수 있게 만들면 JVM위에서 돌릴 수 있다.

자바 처음 공부할 때 이런 내용을 본 것 같은데
그때는 뭐 컨셉만 잡아놓고 말겠지~라고 했는데

하나씩 나왔다.
jRuby, jython, … 이정도?

사실 여기까지는 쓸모없다고 느꼈었다.
네이티브로 돌리면 되는걸 왜 jvm으로 돌려~
그리고 같은 언어라고 하긴하지만… 세부 문법까지 똑같지는 않을거고
이거 복사해서 붙여넣는다고 cruby, cpython에서 돌아가는것도 아니잖아~’라고 생각했었고 지금도 그렇다.

그런데.. groovy, scala, clojure 등의 언어가 나오면서 상황이 좀 바뀐 것 같다.

groovy, scala는 spring에서도 지원하고 있고

playframework는 scala 전용프레임워크 정도로 자리를 잡은 것 같다.

이중 clojure는 … 지구의 90%이상 프로그래머가 모언어로 섬기는 C언어에 짓눌려 기를 못 펴고 있다.

scala함수형, groovy스크립트 정도로 이해하고 있는데.. 그래도 문법 자체가 c계열에서 크게 벗어난다는 느낌은 없었는데

lisp계열인 scala는… 정말 다르다.

언어의 너무 다른 컨셉때문에라도 한번 익혀놓는게 좋지 않을까 싶을정도…
그래서 clojure도 한번 해보려고 한다.

 

내 경험상… 언어를 잘 익히려면 뭔가를 만들어봐야 하는데.. clojure을 이용해서 만들만한게 뭐가 있을까 모르겠다. 언어의 특성에 따라 만들기 좋은 작품이 있는데…

몇몇 클로저 라이브러리를 보고 느낀건데… 가독성은 상당히 좋은 것 같다.
줄바꿈도 잘 지켜지고..
자바나 파이썬에서 많이 보이는 변태적인 문법도 오히려 더 적어보인다.

일단 자바기반 프로젝트에 라이브러리를 클로저로 심는 정도로 하는게 좋을 것 같다.

Gradle을 왜 써야하나

그래들.. Ant/Maven/Ivy 등 자바의 다양한 빌드 툴중 하나 정도…

Java를 주로 쓰고 Groovy를 보조로 그리고 요즘 Scala를 살짝 보려고 하고 있는데… 순수 Java개발이라면 상관없지만 복합적인 프로젝트를 만들려면 Gradle이 필수적이다.
(Maven으로 해도 되긴 하는데..  예전에 시도했을 때는 groovy의 특정 버전이 안먹힌다던가 하는 문제가 있었다)

scala는 또 따로 sbt가 있긴하던데… 비슷한 기술들을 이것저것 익힐 필요는 없을 것 같고 조금 더 많이 사용하는 Gradle을 쓰는게 낫지 않을까 호환성 측면에서도
gradle vs sbt 참고자료 : http://stackoverflow.com/questions/11061938/comparing-sbt-and-gradle
요약하면 sbt는 ivy기반이고 snapshot 라이브러리(버전을 중복해서 막 배포하는 라이브러리)에 대응하지 못한다는 것.(인것같다)

개인적으로는 네이티브 자바 라이브러리 개발 및 배포 상황에서 메이븐 셋팅을 다 갖춰놓았기 때문에 이 부분까지 Gradle로 대체할 생각은 없고 java groovy scala를 복합적으로 적용해야 하는 상황에만 사용할 예정이다.

 

Gradle관련 공부하면서 본 책

[도서]엔터프라이즈 자동화를 위한 그래들
여태껏 Gradle 셋팅을 튜토리얼만 찾아보면서 배워가지고
좀 더 구석구석 공부하려고 책을 봤는데
튜토리얼이 다인 것 같다.
한글로 읽어서 편하고 빠르게 이해할 수 있다는 점에서 만오천원 정도 쓸 가치는 있다.
번역서도 아니고 저자가 직접 저술한 책이라 어설픈 번역투도 없어서 이해도 더 잘된다.

 

Gradle을 왜 써야하나

Gradle이 대세이고 지금 기능도 제일 좋은 것 같다.
다른걸 잘 써 왔고 사용하려는 기능이 다 제공된다면 굳이 바꿔야할 필요가 없지만, 배워놓을 필요는 있는 것 같다.
처음 배운다면 Java/Scala/Groovy 뭘 하던 Gradle.

Gradle 참고자료

Gradle 공식 소스코드
https://github.com/gradle/gradle
Gradle 공식홈페이지
https://gradle.org
groovy 테스트 라이브러리
https://github.com/spockframework/spock-example

JAVA – Serializable

Serializable은 왜 사용하는가?

자바의 직렬화 기능을 사용하는 객체를 명시적으로 알려준다. 이것을 안쓰면 직렬화가 안된다.
라고 알고 있었는데

이 기회에 알아보려고 좀 찾아봤다.

 

 

기존에는이 객체는 데이터 오브젝트이다 라는 것을 명시하기 위해 사용했었다.
ajax, rest api 등등에 사용하는 DTO(VO..) 객체에 그냥 붙였다. gson/jackson을 이용한 serialization에는 필수적이지는 않지만 그냥 확실히 표시 해 주기 위해서..
AjaxWrapper<T extends Serializable> 을 명시해서 Serializable가 선언된 DTO만 들어올 수 있도록

이경우 MAP을 사용할 수 없지만 -> 이 설계를 잡을 때 명시적인 도메인을 쓰고 map을 쓰지 않는게 원래 목표였으니 잘된건가?

 

Serializable 인터페이스에 대해 알아보기 위해.. 먼저 

Serialization하고 붙어다니는 serialVersionUID
이게 선언되어 있지 않으면 jvm에서 자동으로 생성을 한다고 한다.
http://docs.oracle.com/javase/6/docs/platform/serialization/spec/class.html#4100

The stream-unique identifier is a 64-bit hash of the class name, interface class names, methods, and fields. The value must be declared in all versions of a class except the first. It may be declared in the original class but is not required. The value is fixed for all compatible classes. If the SUID is not declared for a class, the value defaults to the hash for that class. The serialVersionUID for dynamic proxy classes and enum types always have the value 0L. Array classes cannot declare an explicit serialVersionUID, so they always have the default computed value, but the requirement for matching serialVersionUID values is waived for array classes.

영어로 서너번 읽은 것 같은데.. 정확히 이해가 안간다.
첫번째 생성한 클래스.. 변경이 없었다면 0L이 기본으로 셋팅이 될테니 꼭 선언을 할 필요가 없다는것 같다.
클래스에 변경이 있었다면 구버전과 비교를 위해 이 넘버를 명시하는게 필수적이 된다는 거시다.(아마도)

 

Serializable에 대단한 기능이나 의미가 있는 것은 아닌 것 같다.
그냥 JVM에서 제공하는 직렬화를 사용한다고 명시하는 것. JVM에서 기본적으로 제공하는 직렬화/역직렬화 기능을 쓸 때 필수적이고, 내가 예전에 썼던것처럼 그냥 json으로 변환할 오브젝트에다가도 대충 갖다가 써또 되지 않을까 싶다. 그래서 계속 쓰던대로 쓰면 될 것 같다.

 

샘플코드를 작성한다면

Book(v0.1) without uid
Book(v0.2) without uid

Book(v0.1) with uid 1
Book(v0.2) with uid 2

Book(v0.1) without uid
Book(v0.2) with uid 2

이렇게 해서 비교해보면 될 것 같다

이건 간략예제

//직렬화
FileOutputStream fileOut = new FileOutputStream("tmp"); 
ObjectOutput output = new ObjectOutputStream(fileOut); 
output.writeObject("object1"); 
output.writeObject(new Date()); 
output.flush(); 
fileOut.close();

//역직렬화
FileInputStream fileIn = new FileInputStream("tmp"); 
ObjectInput input = new ObjectInputStream(fileIn); 
String today = (String)input.readObject(); 
Date date = (Date)input.readObject();
fileIn.close()