흔히 '개발자'라고 하는 [각주:1]SW엔지니어가 직업으로서 어느 정도 매력이 있는 지 생각해 보자. 사람들이 생각하는 좋은 직업이 갖추어야 할 조건을 나열하면 다음과 같은 것들이 있다.

1. 고액의 연봉
2. 전문 지식이 필요함 (진입장벽이 높음)
3. 근무시간이 규칙적이거나 자기 마음대로 조절이 가능함
4. 업무 진행을 주관적으로 할 수 있음
5. 적은 스트레스
6. (무언가 더 나은 세상을 만들기 위해 노력한다는) 주위의 인정

  개발자라는 직업이 위에서 열거한 것들에 몇 가지나 만족할 지 생각해 보면 2번외에 없는 것 같다. 그나마 2번 역시 닷컴 버블을 거치면서 직업훈련원과 학원에서 대량 양산된 인력들로 인해 장벽이 많이 낮아진 상태다. 개발자는 과연 좋은 직업일까. 어떤 아기의 돌잔치에서 돌잡이 쟁반 위의 마우스를 그 아버지가 집어 던졌다는 웃지 못 할 이야기를 들은 적이 있다. 개발자였던 아버지는 자기 자식도 같은 길로 들어서기를 바라지 않았던 것이다. 
  개발자는 항상 시간이 부족하고 과도한 업무에 시달린다. 개발자의 시급이 맥도널드 알바생보다 못하다는 자조 섞인 이야기도 한다. 물론 과장해서 표현한 것이지만 들이는 노력 대비 받는 대가가 적다는 것을 빗대서 하는 말이다. 또 개발자는 끊임없이 공부해야 한다. 신기술은 하루가 멀다하고 쏟아져 나오고, 시대에 뒤쳐지지 않으려면 어제 배웠던 것들은 박스 속으로 던져 버리고 꾸준히 새 책을 사서 읽고 익혀야 한다. 지금 산적해 있는 문제를 풀고 새 제품을 만들기도 바쁜데 주위는 잔소리꾼들뿐이다.

(출처: Google 이미지)

  나는 위에서 이야기 했던 아이의 아버지가 자기 직업을 나쁜 직업이라고 여겼으리라고는 생각하지 않는다. 개발자라는 직업에는 이 분야에 발을 들여놓게 하고 쉽게 떠나지 못하게 만드는 매력이 있다. 밤을 새가며 재현도 잘 되지 않는 이슈를 해결했을 때, 그저 한 마리 벌레를 잡았을 뿐이지만 왠지 스스로가 자랑스럽게 뿌듯하게 느껴진다. 하지만 이것만으로는 만족할 수 없다.
  개발자라는 직업이 좋은 점은 다음 두 가지가 있다. 첫째 위에서도 언급했듯이 끊임없이 공부를 해야 한다. 단점으로 이야기 했던 것이 오히려 매력이 된다. 연차와 실력은 정비례하지 않는다. 개발자들의 특성 중 하나가 무언가 새로운 것을 계속 배우고 도전하고 싶어 한다는 점인데 지식 노동자로서 일신우일신 하는 자신의 모습을 보며 만족감을 느낀다. 거꾸로 이야기해서 당신이 만약 발전 없는 하루하루를 보낸다고 느낀다면 분명히 불행한 회사생활을 하고 있다고 확신한다.
  다음으로 좋은 점은 무엇을 '창조'한다는 점이다. 물론 그 아이디어가 당신의 아이디어가 아닐 수 있다. 상품기획 부서의 요청에 의해 또는 시나리오를 쓰는 UX개발부서에 의해 만들어 진 기능일 수도 있다. 하지만 결국 그 아이디어를 검토하고 실제 구현해서 사용자가 실물로써 만질 수 있도록 하는 것은 개발자의 몫이다. 그 목표를 이루기 위해 기존에 없는 해법을 찾아내는 것도, SW의 성능을 향상시키는 것도 개발자 외 그 누구도 하지 못한다. 음악, 미술, 문학과 같은 예술 분야에만 '창조성'이 필요한 것은 아니다. 혁신은 항상 기존 형식을 파괴했던 창조적 작업에서 만들어 진다. SW 개발이라는 분야가 [각주:2]70년이 채 안 되는 역사를 거쳐 오면서 어느 정도 외형적 틀은 갖추어 졌다. 하지만 창조성이 결여된 SW개발은 기존 방법을 답습하는 것에 지나지 않는다.
  SW 엔지니어는 그저 그런 직업이 아니다. 돈을 많이 벌기를 원한다면 다른 직업을 찾아보는 게 낫다. 물론 멋진 아이디어를 구체화해서 돈방석에 앉을 기회는 얼마든지 열려있다. 우리나라에서는 한 번 실패하면 재기하기 어렵다는 점이 있기는 하지만 주위 인맥을 쌓고 국가 지원 프로그램을 잘 이용하면 도전해 볼 만한 가치도 있다. 공무원처럼 안정된 노후를 보장하지는 않지만 자기만족감은 무엇보다 큰 직업군이라고 생각한다.
  치열한 개발자의 세계의 문을 연 당신을 환영한다. 함께 한 번 즐겨보자.

이미지 출처: http://sangminpark.wordpress.com/2011/09/27/너드의-코드/


  1. 이 글에서는 개발자라는 용어와 SW엔지니어라는 용어를 동일한 뜻으로 혼용한다. [본문으로]
  2. 1946년 18,000여 개의 진공관과 1,500개의 계전기로 이루어진 ENIAC에서 배선반에 일일이 배선하던 것을 SW개발의 시초로 본다면 아직 채 70년이 되지도 않았다. http://ko.wikipedia.org/wiki/컴퓨터의_역사 [본문으로]
저작자 표시 비영리 변경 금지
신고


가로 세로 회전 시 Activity의 상태를 유지하는 방법은 아래 블로그를 참고

위 방법대로 했음에도 불구하고, 
IME (Soft Keyboard)를 띄운 상태에서 가로 세로로 전환했을 때 입력한 내용이 표시가 되지 않는다면, AndoidMenifest.xml 파일을 확인해 보라.

만약 아래 처럼 android:minSdkVersion를 정의해서 쓰고 있다면 이를 삭제해서 테스트를 해 보자.
<uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="16" />

android:minSdkVersion은 안드로이드 OS버전이 얼마 이상 되야 이 앱이 설치될 수 있다는 것을 기술하는 부분인데, 
왜 도대체 이 부분이 문제가 되는 지는 잘 모르겠다.

IME 버그인지.. 안드로이드 버그인지..


저작자 표시 비영리 동일 조건 변경 허락
신고

  먼저 내 소개부터 해야겠다. 
  나는 우리나라 사람이라면 누구나 아는 모 대기업의 휴대폰 사업부에서 근무하고 있다. 입사 전에는 학부에서 기계공학을 전공했고 관련 업계에서 병역 특례로 군복무를 대신했다. 학사 병역특례가 대게 그렇듯 (물론 그렇지 않은 좋은 업체도 많은 것으로 안다) 열악한 근무환경에서 일을 하다 보니, 공부할 때에는 그나마 재미있었던 전공이 앞으로 내가 먹고 살아야 할 업(業)으로 삼기에 적합한 것인가 하는 의문이 들었다. 3년 정도야 군대에서 고생하는 셈치고 참고 견딜 수 있었지만 평생을 이 업계에서 몸담을 자신이 없었다. 그래서 전공을 멀티미디어 공학으로 바꾸고 대학원으로 진학했다. 그 후 지금까지 IT업계에서 그것도 최전선이라고 할 수 있는 개발자의 삶을 살고 있다. 
  IT 기술은 미쳐 따라가기 힘들 정도로 빨리 변한다. 기술 변화 속도가 빠른 만큼  익혀야 할 지식은 쌓여가고 갈고 닦아야 할 기술들도 늘어난다. 끊임없이 공부하지 않으면 금세 뒤쳐지게 된다. 내가 몸담고 있는 휴대폰 업계 역시 최근 10여년간 눈부신 발전을 이루었고 그 가운데에서 많은 것들을 겪었다. 말 그대로 산전수전 다 겪었다.
  군대 다녀온 남자들이 군대 이야기를 시도 때도 없이 화제로 올리는 이유는 그만큼 군대에서 고생했고 인생에서 힘든 시기를 보냈기 때문이다. 아무리 후방의 '땡보직'에서 복무를 마쳤다 해도 군대생활은 힘들기 매한가지다. 어느 IT 업계든 힘들지 않은 곳이 없으랴만, 휴대폰 개발자로의 삶은 어디 못지 않게 고되다. 그 힘든 삶을 지속하게 해 준 것들에 대해 감사를 느낀다. 그리고 그 것들을 글로 남겨서 공유해야 겠다는 마음이 생겼다. 
  가끔 3개월을 못 채우고 퇴사하는 사람들을 본다. 그 사람들의 끈기가 부족하다고 생각하지 않는다. R&D, 흔히 말하는 '개발'이라는 업무가 적성에 맞지 않았던 것이다. 오히려 이를 일찍 깨우치고 다른 일을 찾아 떠난 이들이 더 현명하다. 그렇지 않다면 꿋꿋이 견디고 깨지고 부딪칠 각오를 하라.
  이제 휴대폰 제조 회사의 R&D 부서에서 8년간 쌓은 경험을 여러분께 공유하려 한다. 물론 나보다 더 훌륭하고 똑똑한 분들이 많을 것이다. 학부 때부터 컴퓨터 공학을 전공하고 체계적인 교육을 받으며 내공을 쌓은 고수들은 차고 넘친다. 하지만 앞으로 쓰여질 내 글이 이제 막 개발자로서의 사회생활을 시작했거나 준비하고 있는 후배들에게 조그마한 길잡이가 되었으면 한다.

저작자 표시 비영리 변경 금지
신고


정규 표현식을 사용하면 코드 양을 획기적으로 줄일 수 있다. 이번 기회에 Java에서 지원하는 정규표현식을 정리해 본다.


일단 Java 정규표현식 문서는 아래 링크를 참조. (JAVA SE7기준)

http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html


문서에 사용예제가 있다.

Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches();


정규표현식의 기본 형식에 대해 테스트 코드를 만들어 보았으니, 첨부소스를 참고하자.


regularExpression.zip


(첨부 소스에 빠진 예제가 많은데, 혹시 예제로 표현해 주실 분은 댓글로 남겨주시면 감사하겠습니다.)


정규표현식 검사기도 있다고 하니 JAVA가 아닌 다른 언어로 정규식을 검사할 때 유용하겠다.


아래는 개발하면서 유용하게 쓰일 정규 표현식들. (유첨 소스의 UsefulExpressionsTest.java에 포함)


IP주소

((([0-9])|([1-9]\d{1})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}(([0-9])|([1-9]\d{1})|(1\d{2})|(2[0-4]\d)|(25[0-5]))


URL

^(https?):\/\/([^:\/\s]+)(:([^\/]*))?((\/[^\s/\/]+)*)?\/?([^#\s\?]*)(\?([^#\s]*))?(#(\w*))?$


Email주소

(\w+\.)*\w+@(\w+\.)+[A-Za-z]+


HTML 주석

<!-{2}(.|\n)*?-{2}>


HTML 태그

^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$


주민등록번호

- 주민번호 체계 공식에 대입하기 전에 간단히 자리수 체크만 할 때 쓴다.

// \d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])-[1-4]\d{6}


한글

[가-힣]+


3자~16자의 사용자 id (영문/숫자/_/- 만 가능)

^[a-z0-9_-]{3,16}$


16진수값

^#?([a-f0-9]{6}|[a-f0-9]{3})$



참고 사이트

1.http://blog.naver.com/PostView.nhn?blogId=fightingdk&logNo=60124162230&redirect=Dlog&widgetTypeCall=true

2. http://goodidea.tistory.com/86

3. http://blog.outsider.ne.kr/360


저작자 표시 비영리 동일 조건 변경 허락
신고


JAVA에서 URL 정규표현식을 알아보자. (발췌: http://goodidea.tistory.com/86)


원문에서는 마지막에 http://www.daum.net 과  같이 URL 마지막에 슬래쉬(/)가 없는 예에서는 에러가 난다.

이를 수정하면 아래와 같이 된다.


^(https?):\/\/([^:\/\s]+)(:([^\/]*))?((\/[^\s/\/]+)*)?\/?([^#\s\?]*)(\?([^#\s]*))?(#(\w*))?$


JAVA 테스트 코드로 바꾸면 다음과 같다.


    @Test

    public void url() {

        String regex = "^(https?):\\/\\/([^:\\/\\s]+)(:([^\\/]*))?((\\/[^\\s/\\/]+)*)?\\/?([^#\\s\\?]*)(\\?([^#\\s]*))?(#(\\w*))?$";

        Pattern p = Pattern.compile(regex);


        assertTrue(p.matcher("https://goodidea.tistory.com:8888/qr/aaa/ddd.html?abc=def&ddd=fgf#sharp").matches());

        assertTrue(p.matcher("http://dextto.tistory.com").matches());

        assertTrue(p.matcher("http://blog.daum.net/dexter").matches());

        assertTrue(p.matcher("http://www.daum.net:80/index.cfm").matches());

        assertTrue(p.matcher("http://xxx:password@www.daum.net").matches());

        assertTrue(p.matcher("http://localhost/index.php?ab=1&c=2").matches());

        assertTrue(p.matcher("http://localhost:8080").matches());

        assertTrue(p.matcher("http://dextto.tistory.com/admin/entry/post/?id=150&returnURL=/entry/JAVA-Regular-Expression-%EC%A0%95%EA%B7%9C-%ED%91%9C%ED%98%84%EC%8B%9D-%EC%98%88%EC%A0%9C").matches());

    }

저작자 표시 비영리 동일 조건 변경 허락
신고