Categories
Daily Development

귀찮을 땐 reflection이 제 맛

아무리 IDE가 좋아졌다할지라도 라디오 버튼, 체크 박스, 콤보 박스, 텍스트 필드가 적절히 섞여 30여개의 입력 필드가 한 화면에 펼쳐져 있다면.. 유쾌하지 않다.

여기에 한 필드라도 고쳐지면 ‘Save’ 버튼이 활성화되어야 하고 그렇지 않다면 비활성화 되어야 한다는 요구가 들어온다면?

htm_20040809011613070000070100-001.jpg

부들부들.

리플렉션의 이름으로 그대를 처단하겠다.


 1
 2   private void installModifyListeners() {
 3     ActionListener al = new ActionListener() {
 4       @Override
 5       public void actionPerformed(ActionEvent e) {
 6         fireModified("various buttons");
 7       }
 8     };
 9     KeyListener kl = new KeyAdapter() {
10       @Override
11       public void keyReleased(KeyEvent e) {
12         fireModified("various fields");
13       }
14     };
15     
16     Field[] fields = this.getClass().getDeclaredFields();
17     for(Field f : fields) {
18       try {
19         Object o = f.get(this);
20         if( o instanceof JComponent ) {          
21           try {
22             Method m = o.getClass().getMethod("addActionListener", ActionListener.class);
23             if( m!=null ) {
24               m.invoke(o, al);
25               continue;
26             }
27             
28           } catch( NoSuchMethodException e ) {}
29         }
30         
31         if( o instanceof JTextComponent ) {          
32           try {
33             Method m = o.getClass().getMethod("addKeyListener", KeyListener.class);
34             if( m!=null ) 
35               m.invoke(o, kl);
36           } catch( NoSuchMethodException e ) {}
37         }
38       } catch (Exception e) {
39         System.err.println(e);
40       }
41     }
42   }

이 글은 스프링노트에서 작성되고 살짝 고쳐졌습니다.

Categories
Development Personal

코딩이 잘 되던 상황을 기억할 수 있는가

코딩을 하고 있다는 것은, 프로젝트의 신경써야만 하는 수많은 이슈들을 잠시 가방에 넣어두고 한순간에 하나씩 집중하여 달리는 것을 말한다. 적어도 내게 코딩하고 있다는 것은 그런 것을 의미한다. 한번에 하나에 집중. 나머지 사항들은 머리속에 있지만 주의력은 전혀 할당되지 않는 그런 상태.

기술 관련 서적을 보거나, 자기관리 책을 보거나, 책들은 ‘좋은 책’이라는 뱃지도 받아야하기 때문에 한 우물만 파는 경우가 별로 없다. 그래서 양서를 보거나 기사를 보면 주의력의 범위가 아-주 넓어진다. 마치 완벽하지 못하지만 열등감에 휩쌓인 완벽주의자처럼. (이라고 쓰고 산만해진다고 읽는다)

그래서 코딩을 하려고 딱 앉으면,

자각하고 있던 모든 것들을 버려야 하기 때문에 (파울로 코엘료의 소설에 나온 열정은 과거에 속하는 모든 것들을 파괴해버린다 가 생각나기도) 코딩에 제대로 몰두하기 어려워진다.

나의 경우 집중이 아주 잘되어, 흔히 ‘Flow’ 상태에 빠지게 된 경우를 생각해보면 다음과 같다.

  • 몸이 아플 때 (여러가지 ‘하면 좋은 것들’에게 신경을 쓸 여력이 없다)
  • 코딩해야하는 어떤 기술이 잘 안풀려서 화가 아주 많이 나 있을 때 (코딩에 집중하도록 마음이 알아서 움직여준다)
  • 코딩해야하는 그 대상이 재미있을 때 (와이프랑 노는 것이 더 재미있다)
  • 안하면 안될 때 (안하면 안된다는 긴장감이, 신경써야하는 다른 모든 것들을 잊게 해준다. 왜, 긴장하면 평소에 잘 하는 것들도 다 까먹지 않는가!)

코딩은 너무 마이크로 하다.

그렇기 때문에 쉬운 개발 언어들이 속속 등장하는게 아닐까 싶다. 마이크로한 곳에 오래 집중하고 있으면 개인 생활이 제대로 돌아갈리 없으니까.

그런데 실력이 미천한 탓인지, 아무리 프로그래밍 언어가 센스있고 API가 잘 설계되어있고 학습 코스트가 0에 가깝자 할지라도, 코딩은 코딩이다. 신경을 써야 한다. 관심과 관리가 없으면 말라죽는 화초처럼, 신경쓰지 않으면 시름시름 앓다가 죽어버린다.

그래서 나의 선택은 코딩 작업을 좀 더 추상적으로 만들기보다는, 마이크로와 매크로 레벨을 넘나들 수 있는 인간이 되는 것이였다. 쉽지 않다. 마이크로 해지면 성질도 더러워지고… 매크로 해지면 자잘한 버그들도 못잡고.. 확장성이나 유연성도 고려하지 못하고..

그럼 결국 나는 열정을 가지고 코딩을 한다는 얘긴데, 이것 상당히 위험한 일이 아닐 수 없다. 열정이 있을 때는, 그것이 없는 사람과는 비교할 수 없을 정도로 좋은 퍼포먼스를 내주겠지만, 만약 상황이 좋지 않아 마이크로 레벨로 돌입할 수 없다면 일 진행을 거의 못하기 때문.

분명히 마이크로 레벨에서 하던 일들을 ‘정보화’ 시켜서 매크로 레벨의 인간인 나에게 자습시킬 수도 있을텐데,

이상하게도 나의 국어실력이 부족해서인지, 마이크로 레벨 상태에서 내가 발산하는 메시지들을 매크로 레벨의 내게 전달할 방도를 찾지 못하고 있다. 분명히 이 둘은 다른 사람이다. 이 두 종단간의 메시징은 어떻게 처리해야 하는 것일까.

SOAP? -_-

이 글은 스프링노트에서 작성되었습니다.

Categories
Life Personal

성장에 대한 단상

과연 사람이 매일 매일 조금씩 성장해 나가는 것일까? 적어도 나는 아닌듯 하다.

나름 퇴행이 아니라 이것이 진정 성숙하고 지혜로워진 것이라고, 실수를 통해 Not TODO 목록을 만든 것이라며 자위했을 뿐이다.

요즘 무언가에 열중하다보면 묘한 기시감을 느끼게 된다. 발전하고 성장한 짜릿한 기분인데도 불구하고, 언젠가 느껴본.
16년전에 이뤘던 것을 되찾고, 8년전에 깨달은 것들.

종합평가를 한다면 그동안 헛짓했음이 발각된 사건일뿐이겠지만, 나는 잠시 분열하여 스스로를 평가하는 사람이기 이전에 현재를 살아가고있는 사람이라 기분이 좋다.

다시 비평가로 변신해보면,
개개인의 인생에 정답따위 없는데 뭐그리 호들갑.

Categories
Daily Development

이클립스로 리팩토링 하다가 문득

요즘 세상엔 리팩토링이나 설계를 바꾸는 일들조차 너무나 쉽기때문에 처음 코딩을 시작할 땐 구현에만 신경써도 된다.

마치 영향력있는 누군가가 자신에게 “이런 기능 구현 가능한가요??” 라고 물었을 때 자존감을 올리기 위해 앞뒤 안보고 구현하는 아가 마인드를 떠올려보라.

이런들 어떠하고 저런들 어떠하리.

코드가 지저분해서 짜증이 올라오기 시작할 때부터 고쳐도 늦지 않다.

개발 도중 동료나 상사가 코드를 보며 부정적 메시지를 가할 때면, ‘겉멋만 신나게 들었구만’ 하며 비웃으면 땡.

Categories
Daily Development

Eclipse SWT & JFace API 문서 합본

몇해전 어느날, jmsn-swt를 만진 이후로 나로부터 버림받은 SWT.. 

 

프리랜서 프로젝트 하나를 진행중이라 swing질을 하고 있는데, 이녀석은 어떻게 된일인지 아직도 Generic 지원할 생각이 없다.  그나마 하나 찾은게 JTree 클래스에 있는 Enumeration<TreePath> getExpandedDescendants( TreePath ) 뿐이다. DefaultMutableTreeNode의 set/getUserObject 정도는 제네릭 지원해줘도 되는거 아닌가. 

그렇게  투덜거리다 미투데이에 투덜거리는 글을 올렸고, 친구들이 SWT/JFace로 넘어오라는 댓글들에 힘입어,

The Definitive Guide to SWT and JFace 

를 질렀습니다! (하지만 정작 SWT/JFace 에도 Generic 지원은 없음; )

 

그런데 SWT 랑 JFace API 문서만 보려니 어딨는지 모르겠어서..

cvs -d :pserver:anonymous@dev.eclipse.org/cvsroot/eclipse co org.eclipse.jface 
cvs -d :pserver:anonymous@dev.eclipse.org/cvsroot/eclipse co org.eclipse.swt 
vim build.xml, … <javadoc … excludepackagenames=”org.eclipse.swt.internal.*” … >

한 곳으로 묶어봤습니다.

 

이에 공유합니다.

다운로드는 여기(4.8M)서.