201가지 소프트웨어 개발원칙

일반원칙
1. 품질이 제일이다.
2. 품질의 정의는 보는 사람에 따라 다르다,
3. 생산성과 품질은 불가분의 관계이다.
4. 고품질의 소프트웨어를 개발할 수 있다.
5. 사후에 품질을 만들어 넣으려 하지 말라.
6. 성능보다 신뢰성이 더 중요하다.
7. 시제품을 고객에게 빨리 보여준다.
8. 고객이나 사용자와 충분히 협의한다.
9. 개발자와 고객에게 적합한 보상기준을 마련한다.
10. 처음 시도하는 것은 폐기할 작정으로 개발한다.
11. 적절한 유형의 시제품을 개발한다.
12. 적절한 기능을 시제품화 한다.
13. 일회용 시제품은 빨리 개발한다.
14. 시스템을 점증적으로 개발한다.
15. 보면 볼수록 더 많은 것을 원한다.
16. 개발중의 변경은 피할 수 없다.
17. 가능하면 개발하기 보다는 구매한다.
18. 사용자 매뉴얼이 간단하게 되도록 소프트웨어를 개발한다.
19. 아무리 복잡한 문제라도 해결책은 있다.
20. 가정한 것이 있으면 이를 기록한다.
21. 다른 단계에는 다른 언어를 사용한다.
22. 도구를 사용하기 전에 기법을 배운다.
23. 도구는 현실적으로 사용한다.
24. 소프트웨어 도구는 우수한 개발자에게만 제공한다.
25. CASE도구는 고가이다.
26. “Know-How”만큼 “Know-When”도 중요하다.
27. 목적을 달성하면 중단한다.
28. 정형적 방법을 알아야 한다.
29. 조직의 평판을 중시한다.
30. 대세를 따를 때는 주의해야 한다.
31. 기술을 무시하면 안된다.
32. 문서 표준을 사용한다.
33. 모든 문서에는 용어정의를 한다.
34. 모든 문서에는 색인을 부여한다.
35. 같은 개념에는 같은 명칭을 사용한다.
36. 연구결과의 기술이전은 즉시 되지 않는다.
37. 책임을 질 줄 알아야 한다.

요구공학 원칙
38. 요구사항이 불명확할수록 비용예측은 어렵다.
39. 요구사항을 기록하기 전에 문제를 확실하게 결정한다.
40. 지금 요구사항을 결정한다.
41. 요구명세상의 오류는 즉시 수정해야 한다.
42. 시제품으로 사용자 인터페이스 선정의 위험을 줄인다.
43. 요구사항 항목의 선정근거를 기록한다.
44. 최소 요구사항을 식별한다.
45. 요구사항을 검토한다.
46. 요구분석단계에서 설계하지 않는다.
47. 올바른 기법을 사용한다.
48. 여러 관점으로 요구사항을 분석한다.
49. 요구사항을 현명하게 조직화한다.
50. 요구사항의 우선순위를 정한다.
51. 간결하게 기록한다.
52. 모든 요구사항에 유일한 식별번호를 부여한다.
53. 요구사항의 모호성을 줄인다.
54. 자연어는 정형모델로 보완만 하고 대체하지는 말라.
55. 먼저 자연어로 기록하고 정형모델을 작성하라.
56. 요구명세서는 읽기 쉬워야 한다.
57. 신뢰성에 대하여 구체적으로 명시한다.
58. “수용 불가능한” 환경조건을 명시한다.
59. 미결정항목은 각주와 함께 작성한다.
60. 요구명세서를 데이터베이스에 저장한다.

설계 원칙
61. 요구사항에서 설계로의 전환은 어렵다.
62. 설계산출물에서 요구사항을 추적한다.
63. 대안을 평가한다.
64. 문서가 없는 설계는 설계가 아니다.
65. 캡슐화 한다.
66. 가능하면 재사용한다.
67. 단순하게 개발한다.
68. 특수한 경우를 많이 만들지 않는다.
69. 지적인 거리를 최소화 한다.
70. 설계를 지적 통제하에 둔다.
71. 개념적 무결성을 유지한다.
72. 개념적 오류는 문법적 오류보다 심각하다.
73. 결합도는 낮추고 응집도는 높인다.
74. 변경이 쉽게 설계한다.
75. 유지보수를 고려하여 설계한다.
76. 오류수정이 쉽게 설계한다.
77. 일반성을 띄게 소프트웨어를 개발한다.
78. 유연성 있게 소프트웨어를 개발한다.
79. 효율적인 알고리즘을 사용한다.
80. 사용자가 필요로 하는 모든 정보는 모듈명세서에 있다.
81. 설계는 다차원적이다.
82. 뛰어난 설계는 뛰어난 설계자가 한다.
83. 어플리케이션에 대해서 숙지한다.
84. 큰 투자 없이도 재사용할 수 있다.
85. 무효한 값을 입력하면 적절한 오류 메세지를 출력하도록 한다.
86. 소프트웨어 신뢰성은 중복성을 통해 얻을 수 있다.

코딩원칙
87. 트릭을 사용하지 않는다.
88. 광역변수를 사용하지 않는다.
89. 하향식으로 읽을 수 있도록 작성한다.
90. 부작용을 제거한다.
91. 의미 있는 명칭을 사용한다.
92. 사람을 위한 프로그램을 작성한다.
93. 최적의 자료구조를 사용한다.
94. 빨리 하기 보다는 올바르게 한다.
95. 코드를 완성하기 전에 주석을 작성한다.
96. 코딩을 시작하기 전에 문서화한다.
97. 모든 구성요소를 책상 위에서 실행시켜 본다.
98. 코드 검사를 실시한다.
99. 비구조적 언어도 사용할 수 있다.
100. 구조화된 코드가 반드시 좋은 코드는 아니다.
101. 너무 깊이 중첩 시키지 않는다.
102. 적절한 언어를 사용한다.
103. 프로그래밍 언어를 핑계 삼아서는 안된다.
104. 언어에 대한 지식은 중요하지 않다.
105. 프로그램의 체계를 정비한다.
106. 코딩을 너무 빨리 시작하지 말아라.

시험원칙
107. 시험에서 요구사항을 추적한다.
108. 시험하기 훨씬 이전에 시험을 계획한다.
109. 자신이 개발한 소프트웨어를 자신이 시험하지 않는다.
110. 자신이 개발한 소프트웨어의 시험계획은 남이 세운다.
111. 시험은 결함을 드러나게 할 뿐이다.
112. 오류의 많고 적음과 소프트웨어의 가치는 무관하다.
113. 오류를 찾아야 성공적인 시험이다.
114. 15% 모듈에서 50%의 오류가 발견된다.
115. 블랙박스시험과 화이트박스시험을 실시한다.
116. 시험사례에는 예상결과를 포함시킨다.
117. 무효한 값으로 시험한다.
118. 항상 스트레스 시험을 한다.
119. 빅뱅설을 적용하면 안된다.
120. McCabe의 복잡도 척도를 사용한다.
121. 효과적인 시험종료 척도를 사용한다.
122. 시험 적용범위를 효과적으로 활용한다.
123. 단위시험이 끝나기 전에 통합하지 않는다.
124. 소프트웨어에 특정한 시험용 코드를 내장시킨다.
125. 오류의 원인을 분석한다.
126. 오류를 개인적인 차원으로 생각하지 않는다.

관리원칙
127. 뛰어난 관리는 뛰어난 기술보다 중요하다.
128. 적절한 해결책을 이용한다.
129. 읽은 것을 모두 믿지 않는다.
130. 고객의 우선순위를 알아야 한다.
131. 사람이 성공의 열쇠이다.
132. 많은 사람보다는 소수정예요원이 더 낫다.
133. 부하 직원의 말을 경청한다.
134. 부하 직원을 신뢰해야 한다.
135. 항상 기대치를 높이 가진다.
136. 능숙한 의사소통 기술은 필수적이다.
137. 진심으로 부하직원을 위해준다.
138. 사람은 의외의 것으로 동기부여 받는다.
139. 사무실 분위기를 조용히 유지한다.
140. 인력과 시간은 대체할 수 없다.
141. 소프트웨어 개발자의 능력차이는 크다.
142. 원하는 목표로 최적화 할 수 있다.
143. 자료수집을 강요하면 안된다.
144. 코드 1줄 당 비용은 무시한다.
145. 완벽한 생산성 측정방법은 없다.
146. 비용산정 모델을 조정한다.
147. 일정은 현실적으로 계획한다.
148. 불가능한 것은 피한다.
149. 측정하기 전에 무엇을 측정할 지 알아야 한다.
150. 생산성 자료를 수집한다.
151. 팀의 생산성을 잊지 않는다.
152. 인월 당 행수(LOC/PM)은 언어와 관계없다.
153. 일정을 믿는다.
154. 정확하게 산정한 비용견적이라도 완전히 맞지는 않는다.
155. 일정을 정기적으로 재조정한다.
156. 약간 적은 견적을 항상 나쁘다고 할 수는 없다.
157. 자원을 적절히 할당한다.
158. 프로젝트를 치밀하게 계획한다.
159. 계획을 최신 버전으로 유지한다.
160. 잦은 계획변경의 파급효과에 주의한다.
161. 최상위 10개의 위험항목을 알아야 한다.
162. 직면한 위험을 이해한다.
163. 적절한 프로세스 모델을 사용한다.
164. 방법론이 당신을 구해주지는 못한다.
165. 기적적인 생산성 향상 비법은 없다.
166. 진척도의 의미를 정확히 알아야 한다.
167. 계획과의 차이만 관리한다.
168. 하드웨어에 과중한 부하를 주지 않는다.
169. 하드웨어의 발전에는 낙천적으로 대응한다.
170. 소프트웨어의 발전에는 비관적으로 대응한다.
171. 예상치 못한 사고로 인해 대혼란이 자주 초래된다.
172. 프로젝트의 사후 검토회를 실시한다.

제품보증 원칙
173. 제품보증 수준은 프로젝트에 맞게 조정한다.
174. 형상관리 절차를 조기에 확립한다.
175. 소프트웨어 프로세스에 SCM을 적용한다.
176. SCM은 프로젝트 관리에 독립적으로 조직화한다.
177. 개발과 제품보증업무 사이를 순환보직화 한다.
178. 모든 중간산출물에 명칭과 버전 번호를 부여한다.
179. 기준선을 통제한다.
180. 모든 것을 보존한다.
181. 모든 변경을 계속 추적한다.
182. 변경관리를 해야 한다.
183. 변경요청에 우선순위를 부여하고 일정계획을 세운다.
184. 대규모 개발에는 검증과 확인(V&V)을 적용한다.

진화원칙
185. 소프트웨어는 계속 변화한다.
186. 소프트웨어의 엔트로피는 증가한다.
187. 고장나지 않았으면 고치지 않는다.
188. 증상이 아닌 근본적인 문제를 수정한다.
189. 요구사항을 먼저 변경한다.
190. 릴리즈 전의 오류는 릴리즈 후의 오류의 원인이 된다.
191. 프로그램은 오래되면 될수록 유지보수하기 어려워진다.
192. 언어는 유지보수성에 영향을 미친다.
193. 때로는 처음부터 수정하는 방법이 좋다.
194. 최악의 구성요소는 처음부터 다시 개발한다.
195. 유지보수는 개발보다 많은 오류를 발생시킨다.
196. 변경한 후에는 반드시 회기 시험을 실시한다.
197. 변경사항이 간단하다고 방심하면 잘못 변경하게 된다.
198. 비구조적인 코드는 구조화해도 개선되지 않는다.
199. 최적화하기 전에 프로파일러를 사용한다.
200. 시스템에 친밀감을 갖는다.
201. 시스템은 환경변화에 따라 계속 변화한다.

출처 : ‘201가지 소프트웨어 개발원칙’ 목차

이쁜 마나..

가만.. 근데 이것들 삥아리 같은데…. 어린것들이 이러다가 일 내징… ㅡ,.ㅡ;

올해의 가운데서, 아버지에게..

모처럼 시골집에 들렸습니다. 아버지를 보며… 이제는 평안하시라고 기원해 드립니다. 난 아직도 기억합니다. 당신의 그 힘들었던 시절을… 어린 자식였던, 나 조차도 아버지의 그 육신과 심신의 힘겨움마저 느낄 정도 였지요. 하지만 아버지께서는 그 힘듬을 겨우…. 버텨내시고 당신의 가족에 대한 하나의 사명을 다 하셨죠.. 아버지 이제는 평안하셔요… 제가 모르는 고통스런 역경이 훨씬 더 많았을테지요.. 이제는 진실로 평안한 모습으로 우리 곁에 계시는 것이 당신의 사명이십니다.. 텔레비젼을 보시며 험한 욕을 한바탕 하고 분을 삭히지 못하시지요. 수년.. 아니 수개월 전까지만 해도 그런 아버지의 모습을 이해하지 못했지요.. 하지만 이제는 조금 이해할 수 있을듯합니다. 아니… 이해해 드릴 수 있을 것 같습니다. 답답하고 모진 이 삶의 푸념을 하소연할 곳이 마땅치 않았던 당신. 마침내는 텔레비전을 하소연할 곳으로 삼으셨던 것이였죠… 죄송스럽습니다. 그런 당신을 좀더 일찍 이해해 드리지 못하고 오히려 당신에게 화를 냈던 이 못난 자식을… 소주를 좋아하시는 아버지… 당신과 마자앉아 소주잔을 즐거이 주고 받을 수 있도록… 소주 주량을 늘려야겠습니다…
[출처] www.DCinside.co.kr

공개 소프트웨어 라이센스 종류와 그 특징들

이제 본격적으로 공개 소프트웨어 얘기를 해보고자 한다. OSI(Open Source Initiative)는 오픈소스 또는 자유 소프트웨어가 어떠해야 하는 지에 대하여 설명하고 있는데 라이선스에서 요구되는 필수적 사항은 ? 무제한의 복사권이 허용되어야 한다. ? 무제한의 사용권이 허용되어야 한다. ? 무제한의 개인사용을 위한 수정이 허용되어야 한다. 공개 소프트웨어 라이선스 종류는 현재 세계적으로 33개를 넘어서고 있다고 한다. 이하에서 살펴보게될 GPL, LGPL, BSD 라이선스, X 컨소시엄 라이선스, 아파치 웹 서버 라이선스, Artistic 라이선스, MPL로 대별되는 유형의 라이선스는 모두 오픈소스 소프트웨어의 정의를 만족시키고 있다. 다만 2차적 저작물의 상업적 재배포에 대한 태도에서 약간 다른 입장을 취하고 있다고 볼 수 있다. 관심이 많은 라이선스 몇 개를 자세히 살펴보면 다음과 같다

GPL
GPL(General Public License)은 MPL이 나오기 이전에 가장 널리 사용되던 공개 소프트웨어 라이선스였다. GPL은 OSS의 가장 대표적인 라이선스로 GNU 프로젝트 소프트웨어를 배포할 때 사용되는 것이었지만 이후에는 GNU 프로젝트로 시작된 것이 아닌 다른 소프트웨어에도 광범위하게 사용되고 있다.
GPL은 리차드 스톨만에 의해 만들어졌고 자유 소프트웨어 재단의 철학을 반영하고 있다. 소프트웨어를 복제하거나 유통하는데 제약은 없지만 몇 가지 조건을 만족시켜야 한다. 사용자가 소스 코드를 쉽게 사용할 수 있어야 하며 배포되는 소프트웨어에는 GNU GPL이 포함되어 있어야 한다. 그리고 쌍방향 프로그램의 경우 프로그램이 시작될 때 이를 게시해야 한다. 프로그램을 수정할 경우에는 언제, 누구에 의해 수정되는지를 명시하기만 하면 된다. 파생 제품을 만들 수 있지만 파생 제품에는 GPL이 적용되어야 한다.
GPL의 가장 큰 특징은 배포된 소프트웨어가 상업용 소프트웨어(proprietary product)로 변질되는 것을 막아주는 조항, 이른바 카피레프트 조항을 가지고 있다는 것이다. 결과적으로 GPL 소프트웨어를 결합하여 만든 소프트웨어는 반드시 GPL이 적용되어야 하므로 이른바 바이러스 효과가 일어난다. 즉 GPL은 저작권을 포기하는 것이 아니다. 만일 개발자나 기업이 GPL이 적용된 소프트웨어의 일부를 사용하여 다른 소프트웨어를 개발할 경우, 기업은 그들이 개발한 소프트웨어의 소스 코드를 공개해야만 한다. 결과적으로 소프트웨어를 제작 판매하는 기업에서는 GPL이 적용된 소프트웨어를 기피하는 문제가 있다고 할 수 있다.
GPL의 주요한 특징을 살펴보면 첫째 소스 코드뿐만 아니라 목적 코드(object code) 또는 실행 가능한 형태(executable form)로도 배포를 허락하지만, 이 경우 어떤 형태로든 소스 코드에 대한 접근이 보장되어야 한다. 둘째, 2차적 저작물이 GPL에 의해 라이선스 된다는 조건하에 코드의 변경 및 재배포를 무제한으로 허용한다. 셋째, 다른 소프트웨어와의 완전한 통합(complete integration)은 그 소프트웨어가 GPL을 수용한다는 조건하에서만 허용된다.

LGPL
이와 같은 이유로 GPL이 소프트웨어를 제작 판매하는 기업에서 사용되는 것에 제한이 있으므로 자유 소프트웨어 재단은 LGPL(GNU Lesser General Public License)을 만들었다. LGPL이 적용되는 라이브러리를 사용해도 개발된 소프트웨어는 GPL에 오염되지 않는다. 이를 만든 이유는 좋은 자유 소프트웨어 제품이 많이 사용되어 표준이 되고 독점 제품과 경쟁할 수 있도록 하기 위해서다. LGPL이 적용된 최초의 소프트웨어는 GNU C 라이브러리였다. LGPL은 GNU 프로젝트에 의해 개발된 소프트웨어와 사적 소프트웨어를 포함한 다른 소프트웨어와의 통합을 허용하기 위해 자유 소프트웨어 재단에 의해 만들어졌다. 자유 소프트웨어가 아닌 모듈과의 링크를 허용한다는 면에서 완전한 카피 레프트 라이선스는 아니라고 할 수 있다.
LGPL은 보통 라이브러리를 라이선스할 때 사용되는데, 특히 자유 라이브러리(free library)에 대응되는 상용 라이브러리가 존재할 때 사용된다. 일반적으로 소프트웨어 개발자들은 비슷한 기능의 라이브러리가 존재할 때 제한이 별로 없는 상용 라이브러리를 사용하게 될 것이고, 그렇게 된다면 자유 라이브러리는 점점 사용되지 않을 것이기 때문이다. 반면 대응되는 상용 라이브러리가 없는 자유 라이브러리를 만들었을 때는 LGPL 대신 GPL을 사용하고 있다.

MPL
MPL(Mozilla Public License)은 넷스케이프가 그들의 브라우저인 모질라의 소스 코드를 공개하는데 사용한 라이선스이다. MPL은 코드와 실행 파일을 분리하여 양자를 보완한 것이다. 코드는 공개되어야 하고 최초의 저작자에게 보완한 내용을 통지해야 한다. 반면에 실행 파일은 독점 라이선스로 배포될 수 있다. 즉 저작자의 이익을 보호할 뿐 아니라, 이 라이선스는 수정, 보완된 소프트웨어의 배포를 통한 상업적 이익을 보호 할 수 있다. 이는 적정한 가격을 요구할 수 있고, 불법 복제에 대해 제재를 가할 수 있다는 것을 의미한다. 또한 소프트웨어를 더욱 보완, 발전시키려는 개발자들의 이익을 보호할 수 있다고 생각한다. 즉 기술적으로 개선을 할 경우 코드를 보고, 수정한 후, 컴파일하여 새로운 독창적인 버전으로 재배포할 수 있다.
MPL에서 유래한 라이선스는 IPL(Interbase Public License), ISC OSPL(Open Source Public License), SPL(Sun Public License), NOSL(Netizen Open Source Lecense), OTPL(Open Telecom Public License), EPL(Erlang Public License) 등이다. MPL도 사용자에게 이후의 라이선스 계약 시 동일한 라이선스를 부과하는 카피레프트 조항을 가지고 있다는 면에서 GPL과 흡사하다. 하지만 이러한 의무가 소스 코드에만 부여된다는 점에서 차이가 있다. 다시 말하면 이용자가 원래의 프로그램에 변경을 가했거나 추가시킨 경우에 해당 소스 코드를 원래의 개발자나 공동체가 사용할 수 있도록 공표해야 하지만, 실행 가능한 바이너리 코드는 상업용 소프트웨어 라이선스를 포함한 어떠한 라이선스를 사용해서도 배포할 수 있다. MPL은 OSS(Open Sousrce Society) 그룹과 산업계와의 타협의 산물이라고 평가받는 데 특이한 점 한 가지는 프로그램의 복제 또는 배포가 특허권에 관련한 경우는 이용자에게 특허의 실시를 허용해야 한다는 점이다. 그러나 원본 코드(original code)에서 제거하거나 분리한 코드, 원본 코드의 개작 또는 다른 소프트웨어와의 결합으로 야기되는 침해에 대해서는 특허 라이선스가 허락되지 않는다.
사용자의 의무에 관하여는 MPL은 GPL의 순수한 카피레프트 라이선스와 유사하다고 할 수 있다. 만일 사용자가 의무를 불이행하는 경우에는 보장된 권리의 자동적인 소멸을 초래하게 된다. 단 GPL과는 달리 라이선스 조건 위반은 이용자의 권한을 즉각적으로 종료시키는 것이 아니라 사실 인식 후 30일 경과하면 소멸한다고 규정한다.
다음은 개발자에게 중요한 개작자의 의무에 대해 살펴보자. 개량자는 코드 개작시 취득한 저작권을 MPL하에 라이선스해야 할 의무가 있다. 그러나 그는 원 코드를 잉여할 권리는 가지지 않는다. 프로그램의 개작(modification)이 발생하면 재작자는 개작된 프로그램 소스 코드를 공개해야 하고 개작 내용(description of modifications)에 대해 문서화할 의무가 있다. 무엇보다도 MPL 적용 프로그램을 실행 버전(executable versions)으로 배포하는 자는 프로그램의 소스 코드에 대한 접근을 가능케 해야 한다. 만일 법규 또는 판례로 인하여 이용자가 준수가 불가능한 경우 이용자는 ‘가장 가능한 범위까지(to the maximum extent possible)’ MPL 조항을 준수해야 하며, 법규들이 영향을 미치는 제한(limitations)을 설명해야 한다고 하고 있다.

BSD
BSD(Berkeley Software Distribution) 라이선스는 언제나 라이선스의 주석에 BSD가 캘리포니아 대학에서 처음 개발된 것이기에 이를 명시해야만 하는 다소 단순하고 귀찮은 의무가 기재되어 있으며 FreeBSD, X, NetBSD 등 여러 변종이 존재한다. BSD는 소프트웨어 산업과 관련하여 가장 다양하게 사용될 수 있는 라이선스라고 할 수 있다. BSD 라이선스가 적용되는 소프트웨어를 수정, 보완한 소프트웨어는 상업용 독점 소프트웨어가 될 수도 있고, BSD 라이선스로 배포될 수 도 있다. 또한 GPL로 배포될 수도 있다.
BSD 라이선스는 예컨대 아파치 웹 서버 등에 사용되는 라이선스로 사용자들에게 거의 제한을 가하지 않는 것이 특징이다. 심지어 카피레프트 조항도 없기 때문에 사적 소프트웨어 벤더들도 BSD 라이선스로 배포되는 OSS 컴포넌트를 그들의 제품에 무제한으로 사용할 수 있다. 예컨대, BSD는 X 라이선스의 변형인데 동 라이선스는 소프트웨어를 사용, 복제, 통합, 변경, 발행, 배포 및 판매할 권리를 부여한다. 다만 때때로 저작권 표기를 요구하거나 코드 변경의 날짜, 저자 및 변경목적을 요구하기도 한다. MIT 라이선스, XFee86 라이선스, X 컨소시엄 라이선스 모두 저작권과 무보증의 표시만 한다면 누구든지 무상으로 소프트웨어를 사용, 복제, 변경, 병합, 출판, 배포, 다시 라이선스 할 수 있으며 이러한 것들을 유상으로 타인에게 판매할 수 있도록 하고 있다. 이같이 라이선스 허용범위가 넓은 이유는 BSD 라이선스가 미국 정부가 제공한 재원으로 운영되었기 때문이라고 한다. X 라이선스는 소프트웨어를 사용, 복제, 변경, 통합, 발행, 배포 및 판매할 권리를 부여한다. 다만 때때로 저작권 표기를 요구하거나, 코드 변경의 날짜, 저자 및 변경목적을 요구하기도 한다.
BSD, X 라이선스, 아파치 웹 서버 프로젝트 라이선스 류의 가장 중요한 사항은 X 라이선스를 따르는 개작을 개인적으로 허가하고 있다는 점이다. 쉽게 말하면 X 라이선스를 따르는 프로그램의 소스 코드를 구해 수정한 후 소스를 공개하지 않고 판매할 수 있다. 즉, 수정한 부분에 대해서는 X 라이선스를 적용하지 않은 채로 판매할 수 있다. 반면 GPL은 개인적으로 개작한 부분은 GPL에 따라서 반드시 배포되어야 한다고 규정하고 있으며, 그에 따라 프로그램 개발자는 타인의 개발성과를 받아볼 수 있다.
BSD는 무엇보다 2차적 저작물에 대한 카피레프트 조항이 없다. 즉, 배포하거나 공표하려는 저작물의 전부 또는 일부가 양도받은 프로그램으로부터 파생된 것이라면, 저작물 전체에 대한 사용 권리를 GPL의 규정에 따라 공중에게 무상으로 허용해야 한다고 GPL이 명시한 부분이 없다. 따라서 상업용 소프트웨어 판매자들도 BSD 라이선스로 배포되는 공개 소프트웨어의 컴포넌트를 자신의 제품에 무제한으로 사용할 수가 있다. BSD 라이선스 정책을 지지하는 사람들은 GPL 라이선스가 지나치게 엄격하다고 비판하기도 한다.
BSD 지지자들은 아무런 제한 없이 소스를 공개하고, 이를 누구든지 자유롭게 재배포하고 수정할 수 있도록 함으로써 이러한 소프트웨어들이 상업적으로도 사용될 수 있도록 문호를 개방하는 편이 훨씬 더 효과적으로 자유로운 소프트웨어의 사용이라는 목표를 달성할 수 있다고 보고 있는 것이다. 그러나 GPL을 지지하는 측에서는 BSD 라이선스를 선택하는 것은 기업들이 소스를 변형하여 2차 저작물을 작성해 이에 대해 독점적인 라이선스 정책을 취할 것이며, 일반인들의 자유 사용이 제한되므로 진정한 자유 소프트웨어는 될 수 없을 것이라고 비판하기도 한다. BSD 라이선스 정책을 취하고 있는 소프트웨어 중에는 세계 웹 서버의 50% 이상에서 작동하고 있는 아파치 서버, Perl 소프트웨어, BIND, sendmail 소프트웨어와 같이 상업적으로도 많이 사용되고 있는 소프트웨어들이 많다. 그 중에서도 BSD 라이선스는 예컨대 아파치 웹 서버 등에 사용되는 라이선스로 사용자들에게 거의 제한을 가하지 않는 것이 특성이다.
이상 BSD 라이선스의 내용을 요약해 보면 다음과 같다. 오픈소스 라이선스 개념에 해당하며 GPL보다는 그 허용범위가 크다. 비자유 상용 소프트웨어와 혼합이 가능하다. 수정된 소스 코드가 원저작자에게 돌아가진 않을 수 있다. 즉, 수정한 후 소스를 공개하지 않고 상업적으로 판매할 수 있다는 점에서 GPL과 차이가 있다. 파생 저작물이 반드시 무상이어야 하는 것은 아니어서 파생물도 GPL을 따라야 하며 무상이어야만 한다고 명시한 GPL과 다른 것이다.