Webプログラミングでは、サーバ側で動作するプログラムとクライアント側で動作するプログラムの両方を開発しなければならない。[1]それぞれの側のプログラムで利用される技術は異なり、さらにAjaxを採用するプログラムであれば、サーバ側・クライアント側のプログラムが複雑に連携して機能を実現するので、それぞれの側のプログラムを別々に開発することが難しく、プログラマには両方の側で用いられる技術を深く習得することが求められる。
クライアント側のプログラミングは、ウェブブラウザの解釈できるプログラミング言語を用いて行われる。しかしながらウェブブラウザはウェブで公開された文書の閲覧に比重が置かれたプログラムであり、必ずしも恵まれたプログラムの実行環境ではないことが多い。
アクセスが殺到しやすいウェブサイトではデータベースに高い負荷がかかりがちであるため、その解決のためにDBMSの知識がソフトウェア開発において求められることが多い。さらに金融系や基幹系業務やB2Bなどミッションクリティカルな領域での開発ではフロントエンドだけでなくバックエンドの開発も行うためUNIXやサーバ、ネットワーク、セキュリティ、計算機科学、ソフトウェア工学の知識が求められる事が多い[2]。
またサーバサイドのプログラムでは多くの場合、複数ユーザの操作に応じた処理が同一プロセスのメモリ空間上で行われるので、ユーザごとに適切にメモリ上の情報が分離されるよう意識してプログラミングしなければならない。この変数がもし銀行口座の預金残高などに使われていた場合、その事態は顧客やエンドユーザーからの信用を徹底的に失うほど非常に深刻なものとなる。
ウェブブラウザはウィンドウシステムやウィジェット・ツールキットとは異なり、アプリケーションがGUIを実現できるようにする事を元来の目的とするプログラムではなく、Web上のHTML文書などを閲覧することを主な目的とするプログラムなので、そのプログラム上で良いGUIを実現するには様々な工夫が求められる。その工夫の例としてAjaxやリッチクライアントがある。
HTMLクライアントの欠点を補うために、HTMLクライアントとクライアントサーバシステムで使われてきたファットクライアントとの中間に位置するリッチクライアントも注目されている。リッチクライアントとして挙げられるものは、Java Start、.NETのClickOnce、AdobeのAIRなどがある。これらの登場により、クライアントサイドの開発は一変しつつある。
^ HTMLによるウェブページの記述はプログラミングではなくウェブデザインとされることも多いが、HTMLはグラフィックデザインだけではなくクライアントからサーバへの通信内容をも定義する等、その境目はあまり明確ではない。
^ この場合、Web開発はフロントエンドだけに力を注いでいるため、ソフトウェア開発全体の氷山の一角に過ぎないケースがある。そのためにこのような開発のことをWeb開発とは呼ばないことがある。