設計のベースは東西線用6000形となり、2000形の特殊な2車体7軸構造からボギー台車による2車体連接構造、平行カルダン駆動に変更された。同じくゴムタイヤ式であるフランス・パリのメトロやメキシコシティ地下鉄の車両とは異なり、札幌方式では急曲線もゴムタイヤのみで走行するため、左右輪の回転数の差を吸収する仕組みが必要となるが、本形式では台車に架装された2基の主電動機を左用と右用として使い分けることで差動装置を不要としており、それぞれの電動機から平歯車で前後の車輪を駆動している。1車体の長さは2000形に合わせて13.5m、客用扉は両開き片側2扉、編成は8両編成、主回路制御方式は6000形と同じ電機子チョッパ制御を採用する。6000形と同様に、乗降促進ブザー音を備えている。第1編成は6000形に近い音色のブザーであったが、第2編成以降は別の音色とされ、以後に増備された車両はすべてこのブザー音に準じている。なお、バリアフリー法に準じた個別ドアへの視覚障害者向けドアチャイムは最後まで設置されなかった。車内の化粧板は6000形のように市内名所のイラストなどは描かれておらず、薔薇が描かれた暖色系のものを用いている。車両間の貫通路は2000形と異なり、すべて6000形に準じた六角形とされた。吊り革は従来通り三角形で6000形同様のカバーなしタイプである。両先頭車1番または16番ドアから運転席にかけてのスペースが2000形よりも短くなったため、着席人員は減少している。1995年から導入された5000形とは客用扉の位置と数が異なるため（3000形：片側16ヶ所　5000形：同24ヶ所）、各駅ホームの乗車位置表示は色分けされ、緑色が3000形、青色が5000形のものである。接近時には2駅前発車の時点で「緑色の乗車位置でお待ち下さい」と放送およびLED案内装置の案内が入る（両端の終点駅だけは例外で、真駒内駅は前駅の自衛隊前駅発車後、麻生駅は2番ホームからの回送後に案内が入る）。なおこの乗車位置の色分けと案内放送は、3000形の運用離脱後にホームドア設置に併せ無くなった。
南北線北24条駅 - 麻生駅間が延伸開業した1978年に登場した。この頃、1971年の開業時に導入された2000形（登場時は1000形）は8両編成化のために中間車が7次車として製造され、本形式は当初その流れを汲んだ2000形8次車として計画された車両である。しかし、後述の様に車体構造、制御方式、デザイン等が大きく変更されたため2000形とはならず、新形式「3000形」とされた。
頭部に書かれた式（条件式）を評価した真偽にもとづき、最初に真になった所の対応する本体を評価した値を全体の結果とする、というような記法はプログラミング言語以前に数学で使われており、Haskellのものなどは以下の歴史よりも、むしろ数学における記法をそのまま取り入れたものに近い。1960年の「Lispの論文」と呼ばれるRecursive Functions of Symbolic Expressions and Their Computation by Machine, Part I（マッカーシー）で導入された、(p₁ → e₁, ・・・, pₙ → eₙ)という記法もその一種と言え、その後のLispではS式による記法が一般的になったものの、それでもLispの、ifではなくcondによる条件式はこれに近い。1963年のCPL（ストレイチー他）にも似たものが存在しており、最初の部分式に対するガードが記述され、その後にガードが偽であった場合の部分式が記述される。例えば以下のように記述される。(x>0) -> 1/x; 0x>0 ? 1/x : 0後半の部分式も条件付きの式として記述できる場合、以下のような記述が可能となる。(x>0) -> 1/x; (x<0) -> -1/x; 01966年のISWIM（Landin（en:Peter Landin））では既に else 節に相当する部分のない条件付き式があり、ガードと二者択一の概念が分離されている。ISWIM では、どの分岐も真でない場合、全体として式の値は「未定義」とされ、値が計算されないと定義されていた。プログラミング言語というよりは理論寄りで提案されたものだが、1975年のGuarded Command Language（ダイクストラ、EWD472）もガードを多用する言語である。文献から引用すると、たとえば、xとyの最大値をmに求める記述はifとガードを使って、if   x ≥ y → m:= x   ▯ y ≥ x → m:= yfi .となる。さらに、繰返し評価を行うdoは次のような記法で、do   ql > q2 → ql, q2 := q2, ql   ▯ q2 > q3 → q2, q3 := q3, q2   ▯ q3 > q4 → q3, q4 := q4, q3od .いずれかの条件が成立する限り繰り返す（ifの場合と違い、doでは複数の条件が成立した場合はいずれかが選ばれる）。1976年のSASL（en:SASL (programming language), en:David Turner (computer scientist)）は「ガード」という用語を使った初期のプログラミング言語の1つであり、関数の定義を複数持たせて、ガードによって適用する定義を選択するようになっていた。これは細かい表面上の違いを除けば、後のHaskellにおける記法のガードの位置を後ろにもってきたようなものであり、あるいはHaskellのそれ以上に数学における記法に似ている。fac n = 1,             n = 0      = n * fac (n-1), n > 01980年代のGuarded Horn Clauses（上田）もガードを多用する言語である。