MS-SQL2007. 5. 9. 22:05
간만에 포스팅이지만, 아마 모르는 사람이 나 빼고는 없지 않을까 싶은 내용이라 참 챙피하다. ㅎㅎ

암튼, MS-SQL에서 Database 목록을 가져오는 쿼리이다. 현재 내가 다니는 회사의 솔루션은 Application Set이라는 논리적인 단위 하나를 만들 때 마다 같은 이름의 데이터베이스를 만든다. 그래서 이런 쿼리가 필요했다. ^^;;

쿼리는 다음과 같다. 그리고 출처는 여기다.

select * from master..sysdatabases

Posted by kkongchi
Software Engineering2007. 4. 25. 22:56

Learn from all experiences

모든 경험으로부터 배운다.


"결정적인 국면에 처했을때 임무를 수행하는 능력은 당신이 그것을 할 수 있다는 자신감에서 나온다. 그 자신감은 어디서 나올까? 과거에 그것을 해보았기 때문이다. 물론, 일단은 처음 그것을 시도해 보아야 하겠지만 그 다음부터는 항상 되돌아 볼 수 있는 귀감이 생기는 것이다. 전에 해보았던 것을 할 때는 마음이 편안해진다.

자신감과 자부심이 관건이다. 자신감은 전에 해보았던 일이라는 생각에서 우러나온다. 연습도, 훈련도, 그 무엇도 하고 싶지 않았던 때가 있었지만 내가 다시 마음을 잡은 것은 누군가가 나를 따라잡는 것을 원치 않았기 때문이다. 바로 그런 이유로, 마지막 2분을 남겨놓고 경기가 초긴장의 상황으로 접어들 때는 내가 어떤 다른 선수들보다 유리하다고 느낀다."

마이클 조던이 ESPN에 기고한 글의 일부이다. 출처는 여기


위의 글에서도 알 수 있듯이 전에 무언가를 성공했다는 경험은 아주 큰 자산이다. 그 경험을 통해서 자신감을 얻을 수도 있고, 또한 그와 비슷한 것을 할 때에 아주 유용하게 그 지식을 써먹을 수가 있다. 이런 자신감과 지식들은 프로젝트 성공에 큰 도움을 줄 수가 있다.

프로젝트 레벨이나 기업 레벨에서는 많은 구성원들이 있기 때문에, 한 사람의 성공적인 경험이 다른 구성원들에게 전달될 수 있게 하는 것이 중요하다. 그러므로 지식 관리 시스템, 위키, 버그 관리 시스템 등의 구축을 통해서 많은 지식과 경험을 축적시킬 수 있는 시스템을 만드는 것은 프로젝트의 성공에 아주 도움이 될 것이다.


다른 원칙 보기

Foster open Communications (열린 커뮤니케이션을 장려한다)

Work toward a shared vision (비전을 공유하고, 그 비전을 목표로 작업한다)
Empower Team Members (팀 멤버들에게 많은 권한을 위임한다)
Establish clear accountability and shared responsibility (팀,개인의 의무를 분명히 하고, 동시에 책임을 모두가 공유해야 한다)
Focus on delivering business value(비즈니스 가치에 초점을 맞춰야 한다)
Stay agile, expect change (언제나 유연하게 변화에 대응할수 있도록 한다)
Invest in Quality (품질에 투자한다)
Learn From all Experiences(모든 경험으로부터 배운다)

Posted by kkongchi
Software Engineering2007. 4. 25. 22:44
Invest in quality

품질에 투자한다.


Whitepaper에도 언급하고 있지만, 절대적으로 완벽한 품질이란 있을 수가 없다. 품질이란 계속해서 쌓아가는 것, 발전해 나가는 것이다. 그러므로, 품질은 프로젝트의 모든 과정에서 고려되어야 한다. 즉, 일단 돌아가게 만든 다음에, 품질을 높인다..라는 어프로치는 안 된다.


MSF에서는 퀄리티 추구를 위해서 두 가지 - 테스팅 팀을 중시하는 팀 모델, 개발자들의 Readiness 관리를 위한 교육 모델 - 를 제안한다. 말은 쉽지만 이 두가지가 모두 잘 되는 프로젝트는 현실적으로 찾기 힘들다. 여러 가지 이유 - 예산의 문제, 일정의 문제 등등 - 로 인해서 소홀해지기 쉬운 부분이기 때문이다. 하지만 결국 이런 부분을 소홀히 했을 때, 결과적으로 퀄리티는 당연히 떨어지기 마련이다.



다른 원칙 보기

Foster open Communications (열린 커뮤니케이션을 장려한다)

Work toward a shared vision (비전을 공유하고, 그 비전을 목표로 작업한다)
Empower Team Members (팀 멤버들에게 많은 권한을 위임한다)
Establish clear accountability and shared responsibility (팀,개인의 의무를 분명히 하고, 동시에 책임을 모두가 공유해야 한다)
Focus on delivering business value(비즈니스 가치에 초점을 맞춰야 한다)
Stay agile, expect change (언제나 유연하게 변화에 대응할수 있도록 한다)
Invest in Quality (품질에 투자한다)
Learn From all Experiences(모든 경험으로부터 배운다)
Posted by kkongchi
.NET General2007. 4. 25. 19:44
현재 내가 근무하고 있는 회사는 BI 솔루션 업체이다. 그래서 이 솔루션이라고 하는 것이 현재 개발 중인 버전만 있는 것이 아니고, 기존에 고객들이 쓰던 예전 버전 또한 존재하기 때문에 기존 솔루션을 유지, 관리하는 일도 아주 중요한 업무 중의 하나이다.

얼마전에 이전 버전 중의 하나에서 이슈가 발견되어서, 처음으로 그 예전 버전을 디버깅할 일이 생겼다. 기존 버전은 Visual Studio.NET 2002를 가지고 개발되었기 때문에 VS.NET 2002 를 설치하고 웹 프로젝트를 열려고 하는데..
문제가 발생했다...

열리지 않는 것이다. 분명히 IIS에 제대로 경로를 잡아줬기 때문에 잘 열려야 하는데 안 열리는 것이었다. -_-;;

그리고 결국 Microsoft Support Sited에서 해결책을 찾았다.
Fix: You Cannot create web project on Windows server 2003 in Visual Studio.NET 2002

위 문서에서 제시하는 해결책은 다음과 같다.
1. Visual Studio 2003으로 개발한다
2. IIS 웹 사이트 속성에서 Mime Type에 확장자 tmp, 타입 text/plain 을 하나 추가한다. 비주얼 스튜디오 2002가 웹 프로젝트를 열기 전에 테스트할 목적으로 .tmp파일을 하나 생성해서 거기에 Request를 보내는데 IIS 6.0에서는 명시적으로 Mime Type에 추가시키지 않으면 블록을 해버린다고 한다. 나는 이 방법으로 해결했다.
3. 위 문서에 링크되어 있는 핫픽스를 설치한다.

아마도 나와 같은 특수한 경우가 아니라면 - 사실 나도 Windows 2003을 쓰고 있어서 그랬지만, 원래 우리 회사 솔루션의 예전 버전은 Windows 2000에 설치하는 것이 원칙이다 - 이런 문제를 만날 일이 없을 지도 모르겠다. 하지만 혹시라도 이런 일이 있다면, 참고하시길 바란다.
Posted by kkongchi
Software Engineering2007. 4. 1. 19:14

Stay agile, expect change

언제나 유연하게 변화에 대응할있도록 한다.



UML의 창시자 중 한명인 Grady Booch는 그의 저서 "The Unified Software Development Process"에서 이렇게 말하기도 했다.
"It is one of the constants of software development that the requirements change."
"요구사항의 변화는 소프트웨어 개발에서 상수(Constants)중의 하나이다"

그래서 Grady Booch 등이 만든 Rational Unified Process 방법론에서는 Iterative(반복적)이고 Cumulative(점진적)인 개발 방법론을 제시하고 있다. 나도 여러 프로젝트에서 몇 단계의 Iteration으로 프로젝트를 나누는 형태로 진행해본 적이 있었다. 그리고 최근의 XP, Agile 방법론 등에서 매우 중요시하는 것도 이 "Agile"이기도 하다.

내가 몸담고 있는 우리 나라 SI에서는 이런 유연성이 상당히 부족하다. 변화를 아예 받아들이지 못하는 것은 아니지만, 그 변화를 주기 위해서 많은 사람들이 고생을 하게 된다..-_-;; 즉, 변화를 잘 받아들이지 못하는 구조로 일정이나 예산 등이 처음에 책정되기 때문인데, 이런 현상 자체가 이미 이 원칙에 대한 의식이 많이 결여되었다는 것을 보여준다. 문제는 이 때문에 퀄리티가 떨어진다는 것이다.

언제나 변화에 빠르게 대응할 수 있는 환경(시간, 예산 상의 버퍼)을 만들어 놓는 것은 그래서 너무나 중요하다. 그것이 먼저이고, 그 후에는 변화에 대응할 수 있는 팀 구조, 방법론(Iteration이나 XP 등)의 적용을 하자.




다른 원칙 보기

Foster open Communications (열린 커뮤니케이션을 장려한다)

Work toward a shared vision (비전을 공유하고, 그 비전을 목표로 작업한다)
Empower Team Members (팀 멤버들에게 많은 권한을 위임한다)
Establish clear accountability and shared responsibility (팀,개인의 의무를 분명히 하고, 동시에 책임을 모두가 공유해야 한다)
Focus on delivering business value(비즈니스 가치에 초점을 맞춰야 한다)
Stay agile, expect change (언제나 유연하게 변화에 대응할수 있도록 한다)
Invest in Quality (품질에 투자한다)
Learn From all Experiences(모든 경험으로부터 배운다)

Posted by kkongchi
Software Engineering2007. 4. 1. 11:59

Focus on delivering business value

비즈니스 가치에 초점을 맞춰야 한다.


사실 내가 그동안 해왔던 Enterprise SI에서는 이 부분이 부족하다고 말할 수 있다. 고객이 원하는 소프트웨어를 거기에서 만들어주는 일이 대부분이기 때문에, 당연히 일을 하는 만큼 어느 정도 돈은 나올테니까.


하지만, 솔루션을 만들어서 시장에 내놓는 일을 하는 업체, 혹은 최근에 많은 웹기반의 일반 사용자용 소프트웨어(웹 2.0이라고 해야 하나?)를 만드는 업체라면 이 부분은 아주 중요하다. 즉, 시장에서 팔릴 수 있는 것, 고객이 돈을 내고 살만한 것을 만들어야 할 것이다. 이런 비즈니스적인 결과가 따라오지 못한다면 개발자나 기획자 등의 동기부여도 잘 안 될 것이고, 틀림없이 결과도 좋지 못할 것이다.


다른 원칙 보기

Foster open Communications (열린 커뮤니케이션을 장려한다)

Work toward a shared vision (비전을 공유하고, 그 비전을 목표로 작업한다)
Empower Team Members (팀 멤버들에게 많은 권한을 위임한다)
Establish clear accountability and shared responsibility (팀,개인의 의무를 분명히 하고, 동시에 책임을 모두가 공유해야 한다)
Focus on delivering business value(비즈니스 가치에 초점을 맞춰야 한다)
Stay agile, expect change (언제나 유연하게 변화에 대응할수 있도록 한다)
Invest in Quality (품질에 투자한다)
Learn From all Experiences(모든 경험으로부터 배운다)
Posted by kkongchi
Software Engineering2007. 3. 4. 22:08

Establish clear accountability and shared responsibility

팀(개인)의 의무를 분명히 하고, 동시에 책임을 모두가 공유해야 한다.



이 원칙을 지키지 못했을 경우에 가장 문제가 될 수 있는 것은 MSF White Paper에서도 지적하고 있듯이, 작업의 중복으로 인한 과잉 작업 혹은 작업의 실종(?)으로 인해서 발생되는 누락등이다. 이건 결과적으로 프로젝트에 매우 큰 해를 끼칠 수 있고, 프로젝트의 실패로 이어지기도 한다.

팀 혹은 개인의 의무를 분명히 하는 것은 사실 어렵지 않다. 처음에 세심하게 준비하고 문서화함으로써 각 팀 혹은 개인이 그 프로젝트에서 갖는 의무를 분명하게 만들 수 있다.


문제는 2번째이다. 전체적인 책임은 모든 팀/개인이 공유해야 한다는 것. 만약에 어떤 팀 혹은 개인이 자신의 의무를 다 하지 못하고. 실패를 한다면 그 것을 누군가는 메꿔야 한다. 그랬을때, 사실 팀 또는 개인이 자신의 일이 아니라는 이유로 방관할 수도 있고 혹은 자신의 일 이외 부분에 대한 이해가 부족해서 그런 작업을 잘 하지 못할 수도 있는 것이다. 즉 프로젝트에 속한 모든 팀/개인이 전체적인 그림에 대해서 이해하고 전체적인 책임을 공유할 수 있어야 이런 작업에 대해서 실패하지 않을 수 있다. 책임을 모두 공유해야 한다는 것은 바로 그런 의미이다.


다른 원칙 보기

Foster open Communications (열린 커뮤니케이션을 장려한다)

Work toward a shared vision (비전을 공유하고, 그 비전을 목표로 작업한다)
Empower Team Members (팀 멤버들에게 많은 권한을 위임한다)
Establish clear accountability and shared responsibility (팀,개인의 의무를 분명히 하고, 동시에 책임을 모두가 공유해야 한다)
Focus on delivering business value(비즈니스 가치에 초점을 맞춰야 한다)
Stay agile, expect change (언제나 유연하게 변화에 대응할수 있도록 한다)
Invest in Quality (품질에 투자한다)
Learn From all Experiences(모든 경험으로부터 배운다)
Posted by kkongchi
C# & VB.NET2007. 2. 26. 11:48
어떤 메소드의 호출자 정보를 알고 싶을 때가 있다. 문제가 발생했는데 디버깅하기가 힘들 때, 이런 호출자 정보들을 로그 등에 기록해둔다면, 문제 해결에 유용하게 쓰일 수 있는 단서가 될 것이다.

System.Diagnostics.StackFrame, System.Diagnostics.StackTrace 객체를 사용해서 호출자 정보를 얻을 수가 있다.

string stackTraceString = null;

System.Diagnostics.StackTrace objStackTrace = new System.Diagnostics.StackTrace(new System.Diagnostics.StackFrame(1));

stackTraceString = objStackTrace.ToString();

return stackTraceString;


마지막에 return되는 값은 다음과 같이 생겼다. 이것이 바로 현재 메소드를 호출한 Caller Method이다.

   at StackFrameTest.Class3.class3Method(String param)



* StackFrame 클래스를 생성할 때 주는 파라미터 - Integer - 를 조정해서, 각 호출 스택 상의 레벨을 모두 추적할 수도 있다.
* 간단하게 ToString()을 하면 저렇게 나오게 되지만, StackFrame 객체에는 GetFileName,
GetFileLineNumber 등의 더 자세한 정보를 알 수 있는 메소드들도 있다.

Posted by kkongchi
규칙 클래스 이름: DoNotExposeGenericList
규칙 ID: CA1002
분류: 디자인 규칙
메시지 레벨: 에러
확실도: 95%

원인: System.Collections.Generic.List<T> 타입을 외부로 노출시켰거나, 리턴 타입으로 사용하거나, 혹은 파라미터로 사용했을 때 이 규칙에 위반된다.

규칙 설명
System.Collections.Generic.List<T>는 성능을 위해서 디자인된 제네릭 컬렉션이며 상속성등은 고려되지 않았다. 그래서 어떤 가상 멤버도 그 안에 포함할 수가 없다. 아래의 제네릭 컬렉션은 상속성을 고려해서 디자인되었으므로, 리턴 타입/파라미터/외부 노출 형식에는 아래 타입들을 써야 할 것이다.

원문: http://www.gotdotnet.com/team/fxcop/Docs/Rules/Design/DoNotExposeGenericLists.html

* System.Collections.Generic.List<T>는 MSDN을 보면 나와있듯이 ArrayList의 Generic 버전이라고 생각하면 된다. 즉, 동적으로 크기가 늘어나고 빠르게 접근할 수 있는 특정 구현 형태로 보면 될 것이다.
외부 노출/리턴 타입/파라미터 등은 각 클래스들이 관계를 맺는 방식에 영향을 줄 수 있다. 이런 곳에서 상속할 수 없는 특정 구현 형태를 사용함으로써 그것에 얽매이는 것은 매우 좋지 않다는 것이 바로 이 규칙이 말하는 바라고 생각된다.
Posted by kkongchi
asp.net2007. 2. 15. 11:26
MSDN Magazine에 IIS 7.0에 대한 글이 실렸다.

http://msdn.microsoft.com/msdnmag/issues/07/03/IIS7/

IIS 7.0의 개선된 점들을 소개하고 있는데, 아래의 네 가지 항목이다.

Modular Web server functionality (웹 서버 기능의 모듈화 - 설치/제거가 간편해 진 듯)
Simplified deployment and configuration (배포, 구성이 간단해졌다)
Extensibility and ASP.NET integration (확장성과 ASP.NET 통합)
Improved security, performance, and compatibility (보안, 성능, 호환성의 개선)

개발자로서 가장 관심이 가는 부분은 아무래도 ASP.NET과 유기적인 통합을 이루었다는 점일 것이다. 위 글에 실린 그림을 인용해 보자면..

사용자 삽입 이미지

ISAPI Native 모듈을 통하지 않고, 바로 IIS와 ASP.NET이 연결이 된다는 것을 볼 수 있다. 위 글은 다음과 같이 그 효과를 설명하고 있다.

When running in Integrated mode in IIS 7.0, ASP.NET modules run in the unified request processing pipeline side-by-side with native C++ IIS modules. This means that existing ASP.NET services like Output Caching, URL Rewriting, and any others provided by your custom ASP.NET modules can now apply to any content type. Better runtime integration also enables ASP.NET modules to access previously unavailable server functionality, removing the need to write native IIS extensibility in most cases.
IIS 7.0이 통합 모드로 운영될 때, ASP.NET모듈은 Native C++ IIS모듈과 나란히 통합적인 리퀘스트 처리 파이프라인에서 동작하게 된다. Output 캐싱, URL 리라이팅과 같으 기존의 ASP.NET 서비스나 혹은 다른 당신이 만드는 별도의 서비스들이 이제는 모든 컨텐트 타입에 적용되게 된다. 개선된 런타임 통합은 ASP.NET이 이전에는 불가능했던 여러 가지 기능을 할 수 있도록 해주며, 결국 기존에 Native IIS 확장 모듈을 만들어야 했던 경우들은 이제 없게 될 것이다.


예전에 모 프로젝트(ASP.NET으로 진행했었던)에서 나는 C++로 ISAPI 필터를 하나 만들었던 경험이 있다. 이 ISAPI 필터의 역할은 특정 Request Header를 검사해서, 그것이 있다면 ID, PW입력이 없이도 Windows 인증을 통과시켜주는 것이었다. 이 것을 ASP.NET의 HttpModule 혹은 HttpHandler로 작성할 수 없을까 조사를 했었는데, 그 때는 그것이 불가능했었다. 왜냐하면 Windows 인증은 ASP.NET까지 오기전 ISAPI 모듈에서 일어나는 일이었기 때문에 ASP.NET으로서는 전혀 방법이 없었기 때문이다. 그런데, 이 그림을 보아하니 이런 경우도 이제는 가능해지는 것이 아닐까 생각된다. ASP.NET이 이제는 IIS와 Full Integration이 된다면, 아마 성능 상에도 많은 이점이 있을 것 같다. 결국은 단계가 하나 줄어드는 셈이 되는 것이니까. 물론 직접 사용해봐야 알 수 있겠지만, 현재로서는 기대가 많이 된다.

Posted by kkongchi